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*位数的