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

题解:

首先很显然的是这是一条链(特殊数据说是链是故意让人迷茫的??)

然后 自己就开始yy 觉得每一次是加入一个使得当前值最小的数

然而这tm又是特殊数据??

那就写一波发现是错的

考虑一下特殊数据的1e5

我们会发现每一次and一下减少至少一个1(或者从此之后保持不变)

这样我们可以枚举这一次的最高位

在剩余的数中寻找是否有这一位为0的 递归下去就可以了

时间是nloga的

再考虑一般情况

显然我们可以设f[i][s]表示前i个,状态为s

转移就是枚举ai,有一个小问题就是 ai会被重复用

但其实想一下就会发现 ai若是重复用 对于s是不会改变的 等于在浪费

很容易可以yy的就是 当这个数没有到达所有数and的和时,一定有数能让他变小

另外i显然是没用的状态可以去掉了

这样时间是na的

dp的瓶颈在转移处

 其实很简单 我们可以考虑枚举它的子集 判断这个是否是合法的

假如判断是O(1)的 那这个就是n^(log2_3)的

如何做到判断O(1)呢?

我们预处理出f[i]表示该状态可以由哪个最小的ai得到 转移就是f[i]------->f[i&(1<<j)] 是n*位数的

posted @ 2018-03-25 22:26  尹吴潇  阅读(193)  评论(0编辑  收藏  举报