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

那么,一开始的想法是考虑每一位的最后出现位置,但这并不容易实现。注意到最终序列是单调递减的。我们在统计答案之前,把公共位先统计掉,即始终都是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;
}

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

最新文章

  1. pt-mext
  2. PAT练习题目录
  3. php模拟数据库常用操作效果
  4. canvas动画
  5. 启动mysql错误ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)
  6. Tomcat7优化配置
  7. supersr--九宫格公式(根据多少行多少列排版)
  8. 2012年 蓝桥杯预赛 java 本科 题目
  9. 转:浅谈CSS在前端优化中一些值得注意的关键点
  10. visualsvn server 安装提示无法启动
  11. [ios2]蓝牙通信【转】
  12. 无锁模式的Vector
  13. python每天一个小练习-强壮的密码
  14. HDOJ2008-数值统计
  15. Linux chown
  16. 《ServerSuperIO Designer IDE使用教程》-3.Modbus协议,读取多个寄存器,实现多种数据类型解析。发布:v4.2.2版本
  17. Spring Boot使用注解实现AOP
  18. Java -cp 命令行引用多个jar包的简单写法(Windows、Linux
  19. 洛谷P4383 林克卡特树
  20. ZSetOperations 操作解释 拷贝过来的 哈哈哈

热门文章

  1. STL之Deque容器
  2. Object-C-Foundation-反射
  3. Python使用闭包结合配置自动生成函数
  4. python的print函数自动换行及其避免
  5. Vector集合——单列集合的“祖宗”类
  6. STM32 定时器级联
  7. js中的children实时获取子元素
  8. tomcat9 性能调优
  9. Django后端项目---- rest framework(4)
  10. Centos7升级gcc学习笔记 gcc 4.8.5 -&gt; gcc 5.4.0