CF1863F Divide, XOR, and Conquer 题解

CF1863F

$\mathcal{O}(n^3)$ 的区间 dp 是好想的,不过是从大区间转移到小区间,考虑怎么进行优化。

状态是难以进行优化的了,从转移入手。

令 $s_i=\sum\limits_{j=1}^{i}a_j$。

对于两个区间 $[l,p)$ 和 $[p,r]$。令 $x=s_{p-1}\oplus s_{l-1}$,$y=s_r\oplus s_{p-1}$。

因为直接对 $x$,$y$ 考虑是麻烦的,需要找出一个定值。令 $z=x\oplus y=s_r\oplus s_{l-1}$。首先 $x=y$ 是容易的,即 $z=0$。考虑什么时候 $x<y$,即有 $z\oplus y<y$,容易得到当且仅当 $y$ 在 $z$ 的最高位是 $1$ 的时候满足条件。这是已经可以对于 所有 $i$ 记录出以 $i$ 为左 / 右端点,所有能被保存下来的区间中是否存在异或和的 $\text{highbit}=k$,这时由于枚举的 $len$ 递减,所以一定是正确的。这是已经优化到 $\mathcal{O}(n^2\log V)$ 了。

最后一步的优化十分显然,因为判断以 $i$ 为端点的区间存储的是 $\log V$ 个 bool 类型的数,然后是找是否有能保存下来的区间的 $\text{highbit}$ 满足和 $s_r\oplus s_{l-1}$ 的与不为 $0$,这就可以直接将二进制压成一个 long long 了,注意特判一下区间和为 $0$ 的情况。

时间复杂度:$\mathcal{O}(n^2)$。

评测记录

posted @ 2023-10-04 09:08  Pengzt  阅读(1)  评论(0编辑  收藏  举报  来源