题目翻译

给定 $n$ 个数 $a_1,a_2,\dots a_n$。有 $q$ 个询问。

每次询问给出 $l,r$,询问是否可以将 $a_l,a_{l+1},\dots a_r$ 分为 $k>1$ 段,使得每一段异或后相同。

$1\leq n,q\leq 2\times 10^5$。多测。$1\leq \sum n,\sum q\leq 2\times 10 ^5$。

题目思路

首先,如果分成 $2$ 段或者 $3$ 段合法,可以证明分成更多段一定合法。如果分成 $2$ 段和不 $3$ 段不合法,可以证明分成更多段一定合法。

因为拆分成更多段一定可以拆成一个 $2$ 段和 $3$ 段。证明显然,自己稍微试几个就懂了。

那么就有一个 $\mathcal O(qn^2)$ 的做法。枚举分割点 $p$ 和 $(p,q)$,则判断是否满足 $\bigoplus\limits_{i=l}^p=\bigoplus\limits_{i=p+1}^r$ 或 $\bigoplus\limits_{i=l}^p=\bigoplus\limits_{i=p+1}^q=\bigoplus\limits_{i=q+1}^r$。

那么可以用类似前缀和的方式优化这一段异或。写出来就是判断是否满足 $b_{l-1}\oplus b_p=b_r\oplus b_p$ 和 $b_{l-1}\oplus b_p=b_q\oplus b_p =b_r\oplus b_q$。

容易发现由于异或的性质 $b_{l-1}\oplus b_p=b_r\oplus b_p$ 也就是 $b_r=b_{l-1}$,分成两段很好处理,直接判断就完了。

分成三段需要稍微处理一下。类似于两段的做法,我们就是需要找到合法的 $p,q$ 满足 $l\leq p\lt q\lt r$ 且 $b_{l-1}=b_p \operatorname{and} b_r=b_q$。

那么我们考虑把相同的一个异或 $x$ 扔到一个 vector 叫 $have_x$ 里,存前缀异或为 $x$ 的位置,那么每次二分处理即可。

异或很大我们提前离散化一下。

时间复杂度 $\mathcal O(q\log n)$。

代码链接

写的有点丑。

注意不能每次拷贝一个 STL 容器,hack 杀疯了。

https://codeforces.com/contest/1968/submission/259198233

最后修改:2024 年 05 月 04 日
v我50吃疯狂星期四