dp uoj370 滑稽树上滑稽果

http://uoj.ac/problem/370

首先糊一个结论 答案组成的肯定是一条链

并且我们一定要用最小的代价把他先变成\(0\)

定义一个状态\(f[S]\)表示当前的滑稽值为\(S\)的最小费用

\[f[S] -> f[S \& a[i]] + S \& a[i]\]

此时复杂度为\(O(na)\)

观察发现转移的顺序与\(a_i\)是无关的

因为他是\(\&\) 起来的 费用就是原先数位上的\(1\)

于是我们就有一个想法

定义状态\(ok[S]\)表示\(S\)可以被某一个\(a_i\)变成0

然后转移就是看某一个\(S\)的子集是否能被变成\(0\)

复杂度挺鬼畜的\(O(a^{log_2 3}) = O(a^{1.58})\)

#include<bits/stdc++.h>
#define int long long
#define fo(i, n) for(int i = 1; i <= (n); i ++)
#define out(x) cerr << #x << " = " << x << "\n"
#define type(x) __typeof((x).begin())
#define foreach(it, x) for(type(x) it = (x).begin(); it != (x).end(); ++ it)
using namespace std;
// by piano
template<typename tp> inline void read(tp &x) {
  x = 0;char c = getchar(); bool f = 0;
  for(; c < '0' || c > '9'; f |= (c == '-'), c = getchar());
  for(; c >= '0' && c <= '9'; x = (x << 3) + (x << 1) + c - '0', c = getchar());
  if(f) x = -x;
}
template<typename tp> inline void arr(tp *a, int n) {
  for(int i = 1; i <= n; i ++)
    cout << a[i] << " ";
  puts("");
}
const int N = 3e5 + 233;
int Max = (1 << 18) - 1, n;
int a[N], f[N], has[N];

main(void) {
  read(n);
  int t = Max;
  memset(f, 38, sizeof f);
  for(int i = 1; i <= n; i ++)
    read(a[i]), t &= a[i];
  for(int i = 1; i <= n; i ++)
    a[i] ^= t, f[a[i]] = a[i];
  for(int k = 1; k <= n; k ++) {
    int st = Max ^ a[k];
    if(has[st]) continue;
    for(int i = st; i; i = (i - 1) & st)
      has[i] = 1;
  }
  for(int st = Max; st >= 1; st --)
    if(f[st] < f[0])
      for(int i = st; i; i = (i - 1) & st)
        if(has[i])
          f[st ^ i] = min(f[st ^ i], f[st] + (i ^ st));
  cout << t * n + f[0] << "\n";
}

原文地址:https://www.cnblogs.com/foreverpiano/p/8628258.html

时间: 2024-10-20 19:15:10

dp uoj370 滑稽树上滑稽果的相关文章

【做题】uoj#370滑稽树上滑稽果——巧妙dp

一个显然的结论是最终树的形态必然是一条链.具体证明只要考虑选定树上的某一条链,然后把其他部分全部接在它后面,这样答案一定不会变劣. 那么,一开始的想法是考虑每一位的最后出现位置,但这并不容易实现.注意到最终序列是单调递减的.我们在统计答案之前,把公共位先统计掉,即始终都是1的位.这样,剩下的位的最终结果都是0.这样,我们就避免了在统计时忽略某些数.那么,我们记dp[i]表示当前的结果为i的最小费用.我们在转移时枚举下一个数字是什么.这里无需担心数字的重复放置,因为它并不能让当前的数字发生变化.那

uoj#370【UR #17】滑稽树上滑稽果

题目 低智选手果然刷不动uoj 首先考虑一下构造一棵树显然是骗你玩的,按位与这个东西越做越小,挂到链的最下面显然不会劣于挂到之前的某一个点下面,所以我们只需要求一个排列使得答案最小就好了 设\(A=\max(a_i)\),发现最优答案不可能要劣于反复对一个数取\(\rm and\)的答案,我们就有了一个\(O(nA)\)的暴力,设\(dp_i\)表示当前的\(\rm and\)和为\(i\),把这个\(i\)变成\(0\)的最小代价 但是有可能最后的\(\rm and\)和也不是\(0\),于是

HDU 5452(离线LCA,树形dp

题目:给出一个图和它的一个生成树,要求删除生成树上的一条边和若干其他边,使得图不连通.求能删除的最小边数. 思路:考虑dp,对于树上的一条边,删除之后,还需要删除的边的数目就是从这个节点的子树连向其他子树或祖先节点的边数.那么对于一棵子树来说这个统计数目就等于其子树的数目之和减去它的子树之间的边数.减的这一部分可以在tarjan离线LCA算法中实现. /* * @author: Cwind */ //#pragma comment(linker, "/STACK:102400000,102400

POJ 1947 Rebuilding Roads (树形dp 经典题)

Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9499   Accepted: 4317 Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, number 1..N) after the terrible earthquake last May. The

【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock&#39;s blog】

树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AVL树,线段树.SPLAY树,后缀树等等.. 枚举那么多种数据结构只是想说树方面的内容相当多,本专辑只针对在树上的动态规划,即树形DP.做树形DP一般步骤是先将树转换为有根树,然后在树上进行深搜操作,从子节点或子树中返回信息层层往上更新至根节点.这里面的关键就是返回的信息部分,这个也没一般性的东西可讲

【Cactus仙人掌图】仙人掌DP学习笔记

我们从例题入手来考虑仙人掌上DP的一般规律叭. Ex 1.仙人掌上的单源最短路问题 联想树上最短路,由于路径的唯一性可以直接做一遍O(n)的搜索.但是仙人掌上显然不具备路径的唯一性这种性质. 那么我们是否需要像对待一般的无向连通图一样使用最短路算法呢? 其实并不需要. 首先一遍DFS处理出仙人掌的结构关系. 然后我们从起点开始DP,假设当前DP到节点为x,那么枚举x的每一个儿子.如果该儿子节点是一个普通节点,那么我们直接可以得到起点到这个节点的距离.如果该儿子节点是个环,则枚举环上每一个节点v,

P2014 选课 - 树形DP[树形背包DP]

P2014 选课 传送门 思路: 树形背包DP模型,\(f[i,j]\)表示以\(i\)为根的子树中,选了\(j\)门课的最大学分.树形DP常以子树\(i\)为阶段.树形背包DP相当于树上分组背包DP.\(f[u,j]=max\{f[u,j],f[u,j-k]+f[v,k]~|~v\in~son(u)\}\).我们枚举从u的子树v中选的课数k,将\(f[v,k]\)作为获得的价值加到\(f[u,j-k]\)得到\(f[u,j]\).注意到当前子树根节点u是必须选的,所以要从\(f[u,j-1]\

Magic boy Bi Luo with his excited tree (树形dp)

Bi Luo is a magic boy, he also has a migic tree, the tree has NN nodes , in each node , there is a treasure, it's value is V[i]V[i], and for each edge, there is a cost C[i]C[i], which means every time you pass the edge ii , you need to pay C[i]C[i].

Test on 09/04/2016

滑稽树  (huajitree.pas/c/cpp) [问题描述] JZYZ的湖畔边有一棵滑稽树,每年的冬天滑稽树上都会长出很多个滑稽果.我们用一个二维平面N,M描述每个滑稽果所能落下的位置,即每个滑稽果不可能落到我们所描述的二维平面之外. 滑稽大师cdc钟爱于收集滑稽果,但是他只有一个篮子,篮子只能放在一个点上,即一个篮子最多收集一个滑稽果.现在滑稽大师cdc想知道他收集到滑稽果的期望值是多少.(cdc放的篮子在任意位置的概率相同) 为了(zao)方(shu)便(ju)起(fang)见(bia