原文链接www.cnblogs.com/zhouzhendong/p/UOJ370.html

题解

首先易知答案肯定是一条链,因为挂在链的最下面肯定比挂在其他节点上赚。

问题被转化成了从一个集合中不断选数加入到当前序列尾端,使得序列的所有前缀 AND 之和最小。

我们发现,假如加入一个数后可以使序列的 AND 值变小,那么必然不会去加一个使 AND 值不变的。

假设 $v = a_1\ {\rm and} \ a_2 \ {\rm and}\ \cdots \ {\rm and}\ a_n$,先使 $a'_i = a_i\ {\rm XOR}\ v$ ,然后对于 a' 来求答案,最后答案加上 $n\cdot v$ 。

由于在序列的 AND 值变成 0 之前,每次都会使 AND 值变小,所以不可能加入相同的数。

于是我们可以得到一个 $O(n^2)$ 的 dp。

设 dp[i] 表示加入若干个数使得当前 AND 值为 i 的最小花费。

转移暴力枚举下一个填什么数。

注意到状态 i 能转移到的状态一定是 i 的子集。而枚举所有子集的复杂度是 $O(a_i^{\log_2 3})$ 的,所以我们可以考虑从这里找到本题的突破口。

我们现在要做的是判断 i 是否能转移到 j 。也就是是否存在一个 k ,使得 $i\ {\rm and}\ a_k = j$ 。

由于 i>j ,所以上式等价于:(~i) and (~a[k]) > 0, i xor ((~i) and (~a[k])) = j 。

于是我们考虑预处理出每一个值 v 是否满足 “存在一个 k ,使得 a[k] and v = v” 。于是 dp 转移的时候就枚举一下自己判定一下就可以了。

但是这样转移可能会导致一些本来没有的转移被转移了,但是显然这个不影响最优解。

时间复杂度:

$$O(a_i ^{\log_2  3})$$

代码

#pragma GCC optimize("Ofast","inline")
#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof (x))
#define For(i,a,b) for (int i=a;i<=b;i++)
#define Fod(i,b,a) for (int i=b;i>=a;i--)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define fi first
#define se second
#define _SEED_ ('C'+'L'+'Y'+'A'+'K'+'I'+'O'+'I')
#define outval(x) printf(#x" = %d\n",x)
#define outvec(x) printf("vec "#x" = ");for (auto _v : x)printf("%d ",_v);puts("")
#define outtag(x) puts("----------"#x"----------")
#define outarr(a,L,R) printf(#a"[%d...%d] = ",L,R);\For(_v2,L,R)printf("%d ",a[_v2]);puts("");
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef vector <int> vi;
LL read(){LL x=0,f=0;char ch=getchar();while (!isdigit(ch))f|=ch=='-',ch=getchar();while (isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return f?-x:x;
}
const int N=1<<18;
const LL INF=1e18;
int n,t=18;
int a[N],vis[N];
int And=(1<<t)-1;
LL dp[N];
int main(){n=read();For(i,1,n){a[i]=read();And&=a[i];}For(i,1,n)a[i]^=And;For(i,1,n)vis[(N-1)^a[i]]=1;For(i,0,t-1)For(j,0,N-1)if (~j>>i&1)vis[j]|=vis[j|1<<i];For(i,0,N-1)dp[i]=INF;For(i,1,n)dp[a[i]]=a[i];Fod(i,N-1,0){if (dp[i]>=dp[0])continue;for (int j=i;j>0;j=(j-1)&i)if (vis[j])dp[i^j]=min(dp[i^j],dp[i]+(i^j));}cout<<(LL)And*n+dp[0]<<endl;return 0;
}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/UOJ370.html

UOJ#370. 【UR #17】滑稽树上滑稽果 动态规划相关推荐

  1. U68464 滑稽树上滑稽果(guo)

    U68464 滑稽树上滑稽果(guo) 题目描述 小小迪有 n 个约会对象,每个对象有一个约会时长 p[i],小小迪 想尽可能多的去完成他的约会(假设小小迪可以瞬移),每个对象还有 一个忍耐时间 q[ ...

  2. D、数列求和(嘤雄难度) J、滑稽树下你和我 I、滑稽树上滑稽果

    D.数列求和(嘤雄难度) 1.  2. 3.考虑先求出  的所有质因数,然后通过容斥来求所有与  不互质的  的和. 4.假设当前容斥算的质数是  ,那么就有  个该质数的倍数,即要求 ,式子化简得, ...

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

    一个显然的结论是最终树的形态必然是一条链.具体证明只要考虑选定树上的某一条链,然后把其他部分全部接在它后面,这样答案一定不会变劣. 那么,一开始的想法是考虑每一位的最后出现位置,但这并不容易实现.注意 ...

  4. 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

    [UOJ#33][UR #2]树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数. 考虑枚举lca,这个 ...

  5. php是世界上最好的语言滑稽,比较滑稽的句子_搞笑逗比的说说语录

    中国古代对滑稽的理解和观念里,滑稽包含了幽默这一概念.一般来说,滑稽的句子说出来都会让人觉得很搞笑,下面小编给大家分享一些滑稽搞笑的经典句子,大家快来跟小编一起欣赏吧. 滑稽搞笑的经典句子摘抄 1. ...

  6. UOJ【UR #12】实验室外的攻防战

    题意: 给出一个排列$A$,问是否能够经过以下若干次变换变为排列$B$ 变换:若${A_i> A_i+1}$,可以${swap(A_i,A_i+1)}$ 考虑一个数字从A排列到B排列连出来的路径 ...

  7. UOJ #514 [UR #19]通用测评号 (容斥原理、DP)

    题目链接 http://uoj.ac/contest/51/problem/514 题解 神仙们都好强啊. 本题有好多做法,但是第一步都是一样的: 题目中的"每次选一个没有达到 \(a\) ...

  8. UOJ #513 [UR #19]清扫银河 (图论、线性基)

    题目链接 http://uoj.ac/contest/51/problem/513 题解 好题. 考虑简化操作: 对于第二种操作,其实就可以等价于若干次单点操作,每次标记一个点,把和这个点相邻的边全部 ...

  9. UOJ 【UR #4】追击圣诞老人 题解

    题目传送门 题目大意: 生蛋老人要找前 kkk 条最短路,生蛋老人可以在节点之间飞跃但是有某些限制,到达一个节点 xxx 就要停 w[x]w[x]w[x] 秒,节点可以重复经过. 题解 新题解传送门 ...

最新文章

  1. 【通俗理解线性代数】 -- 施密特正交化与QR分解
  2. Python知识点8——文件与异常
  3. PNaCl:Google通过LLVM增强对Chrome中原生应用的支持
  4. Mysql多表查询笔记
  5. 关于Angular里给Component protected方法写单元测试的技巧
  6. TCP面向连接中的“连接”和“可靠”与“不可靠”
  7. Oracle Solaris 本地安全漏洞2
  8. C语言--冒泡排序法(详细注释)
  9. 你的手机浏览器不支持webgle_Chrome 不支持 WebGL 怎么办?
  10. [作品]文本修辑转换器
  11. 科技云报道:安全脱管不如托管
  12. 怎样使表格中的数字自动计算机,#怎样让一个表格自动加或乘#如何使excel表格里多个数同时除以1000?...
  13. pipconda 搜索包|查看可安装包版本
  14. 计算器模拟器中的情怀——Free42简介
  15. springboot 微信太阳码_springboot教务管理系统+微信小程序云开发
  16. 九大狗年生肖宝宝取名原则
  17. 高校应该如何建设大数据实验室?
  18. Linux-X86和Linux-ARM编译binutils
  19. Excel玩转工资条
  20. 冒着得罪“技术大V”的风险,曝光他的搞钱套路!

热门文章

  1. bzoj 1095: [ZJOI2007]Hide 捉迷藏
  2. Tian Ji -- The Horse Racing
  3. 机器学习-斯坦福:学习笔记6-朴素贝叶斯
  4. C# ListT用法
  5. 22个HTML5 技巧二
  6. 《LeetCode力扣练习》剑指 Offer 10- I. 斐波那契数列 Java
  7. VS2010旗舰版无法安装
  8. php多图片上传程序,php多文件上传 多图片上传程序代码
  9. php mysql 时间戳查询_mysql中时间查询函数(包括时间戳)
  10. 怎么做圆一圈圈扩散效果_推广为什么没有效果,网络推广怎么做才有效果?