一个显然的结论是最终树的形态必然是一条链。具体证明只要考虑选定树上的某一条链,然后把其他部分全部接在它后面,这样答案一定不会变劣。

那么,一开始的想法是考虑每一位的最后出现位置,但这并不容易实现。注意到最终序列是单调递减的。我们在统计答案之前,把公共位先统计掉,即始终都是1的位。这样,剩下的位的最终结果都是0。这样,我们就避免了在统计时忽略某些数。那么,我们记dp[i]表示当前的结果为i的最小费用。我们在转移时枚举下一个数字是什么。这里无需担心数字的重复放置,因为它并不能让当前的数字发生变化。那么,我们就有如下第5档部分分。

memset(dp,0x3f,sizeof dp);
for (int i = 1 ; i <= n ; ++ i)dp[arr[i]] = arr[i];
for (int i = MAX - 1 ; i >= 1 ; -- i)for (int j = 1 ; j <= n ; ++ j)if ((i & arr[j]) < i)dp[i&arr[j]] = min(dp[i&arr[j]],dp[i] + (i&arr[j]));

注意到这里需要(i&arr[j])<i,即\(C_uarr[j] \bigcap i \neq \emptyset\)。那么,我们把所有\(C_uarr[j]\)的子集存下来,然后转移时枚举子集就做到dp时复杂度与n无关了。
时间复杂度大概是:\(O(a^{log_23})\)。
看起来很爆炸,但是非常不满。

#include <bits/stdc++.h>
#define rint register int
using namespace std;
typedef long long ll;
const int N = 200010, MAX = 1 << 18;
int arr[N],n,avail[MAX + 5],com;
ll dp[MAX + 5];
#define rev(x) ((x) ^ (MAX - 1))
int main() {com = MAX - 1;scanf("%d",&n);for (rint i = 1 ; i <= n ; ++ i)scanf("%d",&arr[i]), com &= arr[i];for (rint i = 1 ; i <= n ; ++ i)arr[i] ^= com;for (rint i = 1 ; i <= n ; ++ i) {if (avail[rev(arr[i])]) continue;for (rint j = rev(arr[i]) ; j ; j = (j-1) & rev(arr[i]))avail[j] = 1;}memset(dp,0x3f,sizeof dp);for (rint i = 1 ; i <= n ; ++ i) dp[arr[i]] = arr[i];for (rint i = MAX-1 ; i >= 1 ; -- i) if (dp[i] < dp[0]) {for (rint j = i ; j ; j = (j-1) & i) if (avail[j])dp[i^j] = min(dp[i^j],dp[i] + (0ll^i^j));}printf("%lld\n",1ll * com * n + dp[0]);return 0;
}

小结:抓住题目的特殊性质是优化的关键。

转载于:https://www.cnblogs.com/cly-none/p/8628280.html

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

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

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

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

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

  3. UOJ#370. 【UR #17】滑稽树上滑稽果 动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ370.html 题解 首先易知答案肯定是一条链,因为挂在链的最下面肯定比挂在其他节点上赚. 问题被转化成了从一个集合中不断 ...

  4. 【做题笔记】LuoguP2664 树上游戏

    LuoguP2664 - 树上游戏 题目链接 做法:点分治 可以发现,每一个点的答案可以分为两个部分: 这个点为端点向下的路径的答案 经过这个点的路径的答案 第一个部分的答案非常好求: 假设遍历到一个 ...

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

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

  6. 2020.7月做题记录

    转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...

  7. NOIP2016考前做题(口胡)记录

    NOIP以前可能会持续更新 写在前面 NOIP好像马上就要到了,感觉在校内训练里面经常被虐有一种要滚粗的感觉(雾.不管是普及组还是提高组,我都参加了好几年了,结果一个省一都没有,今年如果还没有的话感觉 ...

  8. AI学高数达到MIT本科水平,学了微积分线性代数概率论等6门课,不光能做题还能出题...

    梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI 让语言模型做数学题,有多难? 强如GPT-3,在9-12岁的小学数学上,第一次才考20多分. 去年底GPT-3用上新方法努力了很久终于拿到5 ...

  9. 退役前的做题记录5.0

    退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...

最新文章

  1. 下一个人才大缺口:量子计算研究人员
  2. NJUST1712(形成三角形面积为整数的个数)
  3. RSS、Atom和Feed概念与实现(django)
  4. ​OCO订单(委托)
  5. python和java学哪个好-Python和Java学哪个好?大家是怎么选的
  6. 人机交互课后习题——感知和认知基础
  7. EndNote X8教程(PDF+video)
  8. 滴滴打车CTO张博:我们要这样玩社区和大数据
  9. 桌面软件图标变白怎么解决
  10. 2.3Linux中的日志管理
  11. 2022Java笔记
  12. [论文解读]Bayesian Generalized Kernel Inference for Terrain Traversability Mapping
  13. 未知USB设备(设备描述符请求失败)解决方法之一
  14. daimayuan每日一题#849 国家铁路
  15. 面试题目之:说出至少4种vue当中的指令和它的用法?
  16. 英语46级报名考试系统
  17. android开发双击唤醒屏幕,安卓手机双击唤醒原理是什么 安卓双击唤醒原理介绍...
  18. Python 产生随机数
  19. system thread exception not handled
  20. 机器学习(Machine Learning)深度学习(Deep Learning)资料【转】

热门文章

  1. android 爆炸动画,一个可以给view显示粒子爆炸/绽放效果的android库 Bloom
  2. java未发现数据源名称并且未指定默认驱动程序_转:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序...
  3. 基于三维点云场景的语义及实例分割:RandLA-Net和3D-BoNet
  4. 刘光聪 | TensorFlow:揭示多语言编程的奥秘
  5. 机器学习(十四)Libsvm学习笔记
  6. java 序列化异常_关于spring:Java序列化异常消息
  7. android 字体空格,android – 在textview中设置字母之间的空格
  8. phpcms attachment.class.php路径,解决phpcms上传不了图片的方法
  9. python api测试框架_python api 测试框架
  10. Java基础---键盘录入工具(Scanner类)