令 m 表示分的组数,si 表示第 i 组的和。
看到位运算,首先考虑按位贪心,从高到低。
可以先假设结果的所有位都是 1,然后再从高位到低位尝试换成 0。
于是问题转化为给定 x,是否有 m∈[A,B] 的方案满足 (nbitori=1si)bitorx=x。
容易发现只需要满足每一个 si 都满足 sibitorx=x 即可。
于是就变成了一个睿智 DP。
首先设 fi,j 表示前 i 个数分 j 段的可能性。
再设 sumi=i∑j=1Yj。 有转移 fi,j=∨k<i,(sumi−sumk)bitorx=xfk,j−1 然后若 B∨i=AfN,i 为真,则 x 合法。
然鹅当 N≤2000 时,O(n3logYi) 就过不去了。
然鹅注意到此时 A=1。
换个状态,gi 表示前 i 个要满足上述条件,最少分几组。
其实也很简单……
gi=minj<i,(sumi−sumj)bitorx=xgj+1 于是判一下 gN≤B 即可。
复杂度 O(n2logYi)。
代码:
1 |
|