CF1083F [* easy]
定义操作为:
选择一个长度为 (k) 的区间 ([l,r]),然后将这个区间异或上 (x)((x) 任意)
定义序列 (a,b) 的相似值为最少操作多少次使得两者相同。如果不行输出 (-1)
支持单点修改修改 (a,b),查询两个序列的相似度。
(k,nle 2cdot 10^5,a_i,b_i<2^{14})
时限 ( m 4s)
Solution
考虑序列 (c=aoplus 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),我们的复杂度为 (qcdot (cnt+frac{n/k}{cnt})),取最优的块大小 (sqrt{n/k}) 得到最优时间复杂度 (mathcal O(qcdot sqrt{n/k}))
空间复杂度为 (omega cdot ksqrt{n/k}) 即 (omegacdot sqrt{nk})
不过最好还是 (sqrt{n}) 分块,不然空间不太行。
然后如果 (kge sqrt{n}) 就直接暴力即可。