CF1083F

CF1083F [* easy]

定义操作为:

选择一个长度为 \(k\) 的区间 \([l,r]\),然后将这个区间异或上 \(x\)\(x\) 任意)

定义序列 \(a,b\) 的相似值为最少操作多少次使得两者相同。如果不行输出 \(-1\)

支持单点修改修改 \(a,b\),查询两个序列的相似度。

\(k,n\le 2\cdot 10^5,a_i,b_i<2^{14}\)

时限 \(\rm 4s\)

Solution

考虑序列 \(c=a\oplus b\),考虑其差分数组 \(0,1...n+1\),不难发现问题等价于每次选两个距离为 \(k+1\) 的数异或然后将其变成 \(0\)

我们发现操作的顺序对答案没有影响,所以可以考虑从左到右操作。每次将 \(c_{i+k+1}'\) 异或上 \(c_i'\)

考虑根据下标 \(\% k\) 的值分类,这样我们得到 \(k\) 个大小为 \(\frac{n}{k}\) 的数组,我们不难发现点 \(x\) 对答案的有贡献当且仅当此处前缀异或和不为 \(0\)

考虑统计一个序列有多少个前缀异或和为 \(0\),然后用总数减去即可,\(-1\) 等价于存在一个结尾不为 \(0\),那么维护一下结尾 \(0\) 的数量即可。

然后不难发现我们的操作等价于后缀异或,由于时限 \(4s\),值域不是很大,我们考虑一下分块,对每个块维护一下每种值的出现次数,和整体异或标记。

设块的大小为 \(cnt\),我们的复杂度为 \(q\cdot (cnt+\frac{n/k}{cnt})\),取最优的块大小 \(\sqrt{n/k}\) 得到最优时间复杂度 \(\mathcal O(q\cdot \sqrt{n/k})\)

空间复杂度为 \(\omega \cdot k\sqrt{n/k}\)\(\omega\cdot \sqrt{nk}\)

不过最好还是 \(\sqrt{n}\) 分块,不然空间不太行。

然后如果 \(k\ge \sqrt{n}\) 就直接暴力即可。

posted @ 2020-10-05 13:00  Soulist  阅读(143)  评论(0编辑  收藏  举报