$n \leq 1e5$个点,每个点有个权值$a_i \leq 2e5$。现将点连成树,每个点$i$的链接代价为$a_i \ \ and \ \ i父亲的代价$,这里的$and$是二进制按位与,求最小总代价。

日常被坑。。。

首先肯定是要把这些点连成一条链,尽量使得代价andand就and成0了。然后呢。。。

方法一:贪心,从小到大排。错误!

5

56499 113007 129845 126701 56282

一组错误数据。

方法二:这个想法还是可以有的,俗话说,贪心不成就DP。看一下那些二进制位化成0的代价。

首先有些位上永远是1,先把这些位提出来,其他位做一个DP,$f(i)$表示集合$i$变成0的代价。

如果直接枚举$a_i$来转移就傻了。。枚举$a_i$转移不如去枚举$i$的子集,对每个状态预处理出是否存在一个数$a_j$,使得$i\ \ and \ \ a_j=0$.这样在算$i$的答案时,我们就知道$i$的每个子集是否可以通过$and$某个数直接挂掉,然后剩下一个补集,带来一个补集的代价。

 //#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
//#include<vector>
//#include<queue>
//#include<time.h>
//#include<complex>
#include<algorithm>
#include<stdlib.h>
using namespace std; int n;
#define maxn 262222
int a[maxn],f[maxn];
bool can[maxn];
int main()
{
scanf("%d",&n);
int ss=(<<)-,tt=;
for (int i=;i<=n;i++) scanf("%d",&a[i]),ss&=a[i],tt|=a[i];
for (int i=;i<=n;i++) can[a[i]^tt]=;
tt^=ss;
for (int i=tt;i;i--)
for (int j=;j<=;j++)
can[i]|=can[i|(<<j)];
f[]=;
for (int i=;i<=tt;i++)
{
if ((i&tt)!=i) continue;
f[i]=0x3f3f3f3f;
for (int j=i;;j=(j-)&i) {if (can[i^j]) f[i]=min(f[i],f[j]+j); if (j==) break;}
}
printf("%lld\n",1ll*ss*n+f[tt]);
return ;
}

UOJ#370. 【UR #17】滑稽树上滑稽果的更多相关文章

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

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

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

    题目 低智选手果然刷不动uoj 首先考虑一下构造一棵树显然是骗你玩的,按位与这个东西越做越小,挂到链的最下面显然不会劣于挂到之前的某一个点下面,所以我们只需要求一个排列使得答案最小就好了 设\(A=\ ...

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

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

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

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

  5. A. 【UR #17】滑稽树上滑稽果

    题解: 首先很显然的是这是一条链(特殊数据说是链是故意让人迷茫的??) 然后 自己就开始yy 觉得每一次是加入一个使得当前值最小的数 然而这tm又是特殊数据?? 那就写一波发现是错的 考虑一下特殊数据 ...

  6. UOJ370 滑稽树上滑稽果 【状压DP】

    题目分析: 答案肯定是链,否则可以把枝干放到主干. 去除一直存在的位,这样0位占满时就会结束. 用$f[S]$表示0位填埋情况,每次转移是它的一个子集,我们考虑可否转移. 再用$g[S]$存储转移是否 ...

  7. 吉首大学2019年程序设计竞赛(重现赛)I 滑稽树上滑稽果 (莫队+逆元打表)

    链接:https://ac.nowcoder.com/acm/contest/992/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K  ...

  8. 吉首大学校赛 I 滑稽树上滑稽果 (Lucas + 莫队)

    链接:https://ac.nowcoder.com/acm/contest/925/I来源:牛客网 题目描述 n个不同的滑稽果中,每个滑稽果可取可不取,从所有方案数中选取一种,求选取的方案中滑稽果个 ...

  9. 【UOJ#33】【UR#2】树上GCD 有根树点分治 + 容斥原理 + 分块

    #33. [UR #2]树上GCD 有一棵$n$个结点的有根树$T$.结点编号为$1…n$,其中根结点为$1$. 树上每条边的长度为$1$.我们用$d(x,y)$表示结点$x,y$在树上的距离,$LC ...

随机推荐

  1. layui模块规范

    刚入公司不久,就开始做项目了,最后还是选择用layui来做前端的页面,一来是可以自适应,二来是用框架比较方便,简洁. 先看下Layui的介绍: layui 是一款采用自身模块规范编写的情怀级前端UI框 ...

  2. python基础一 day14 复习

    迭代器和生成器迭代器:双下方法 : 很少直接调用的方法.一般情况下,是通过其他语法触发的可迭代的 —— 可迭代协议 含有__iter__的方法('__iter__' in dir(数据))可迭代的一定 ...

  3. python基础一 day10(1)

    要背的:

  4. 清理数据库事务——SQL语句

    清除流程内部的所有相关数据 eg1: declare @procedureTemp table ( [ProcedureCode] varchar(10) ) declare @ProcedureCo ...

  5. assign, retain, copy, weak, strong

    一.assign, retain, copy 的区别(引用计数 RC reference count) 参考:IOS基础:retain,copy,assign及autorelease 1. 假设你用m ...

  6. iOS 第三方类库之MBProgressHUD

    github链接地址 MBProgressHUD是一个开源的第三方类库实现了很多种样式的提示框,类似Activity indicator,使用上简单.方便,并且可以对显示的内容进行自定义,功能很强大, ...

  7. ViewController的lifecycle和autolayout

  8. 调用 C 动态库

    调用 C 动态库 由 王巍 (@ONEVCAT) 发布于 2015/11/04 C 是程序世界的宝库,在我们面向的设备系统中,也内置了大量的 C 动态库帮助我们完成各种任务.比如涉及到压缩的话我们很可 ...

  9. ECMAScript5 [].reduce()

    ECMAScript 5 的2个归并数组的方法,reduce() reduceRight() 两个方法都会迭代数组的所有项,然后构建一个最终返回的值. 两个参数:   1.函数,一个在每一项上调用的函 ...

  10. 剑指Offer(书):链表中环的入口节点

    题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. public ListNode EntryNodeOfLoop(ListNode pHead) { //第一步,查找是 ...