CF1456E XOR-ranges

发布时间 2023-07-12 20:59:32作者: 275307894a

题面传送门

好题。

首先比较自然的,相当于按照数位 DP 的方法,将 \([l,r]\) 剖成 \(k\) 段,其中每一段都是最高若干位确定,底下若干位任取的形式。这样在 \([l,r]\) 里面选择相当于在这 \(O(k)\) 个区间里面选择。

然后假设我们依次选择好了,考虑如何计算答案。答案显然是位独立的,对于某个数的某一个确定的位,找到其左边第一个这位也是确定的数,计算其贡献即可。

假设记 \(len_i\) 表示第 \(i\) 个数被确定的位数,那么 \([i,j]\) 的从高到低第 \(c\) 位能计算共享当且仅当 \(len_i\geq c,len_j\geq c,\min\limits_{i<k<j} len_k<c\)

式子中出现了 \(\min\),可以考虑在笛卡尔树上 DP。设 \(f_{c,l,r,x,y}\) 表示比 \(c\) 低的位的贡献已经确定,当前 \(l-1\) 选择的数为 \(x\)\(r+1\) 选择的数为 \(y\),且 \([l,r]\) 区间内的 \(len\)\(\geq c\) 的最小贡献。转移只需要枚举中间的某一个也为 \(c\) 的即可。

根据上面剖区间的过程不难发现,当 \(c,x,y\) 确定的时候, \(l,r\) 分别都只有四种取值,因此复杂度是 \(O(n^3k)\) 带大常数的。

submission