%你赛T2 query
题意
多组询问 \(l,r\)
求:
\[\oplus_{l\le i \le j \le r} (a_i + a_j)
\]
\(n,q\le 2\times10^5\)
转化
显然加法做不了,那么我就去思考加法和异或之间的联系。
我们知道异或是没进位的加法,也就是说:
\[a+b=a\oplus b\, \oplus c
\]
其中 \(c\) 是进位部分的异或和。
如:
\[\begin{array}{r r r r}
& & 1 & 1 \\
+ & 1 & 1 & 1 \\
\hline
1 & 0 & 1 & 0
\end{array}
\]
则 \(c=2^1+2^2+2^3=14\)
如:
\[2+3=2\oplus 3\oplus 4
\]
?
正常来说,到这里思路就应该豁然开朗了。
但我居然就完全不知道怎么去找进位...
实际上进位有一个非常著名的技巧使得进位可以按位处理。
比如要去找二进制下第 \(i\) 位的进位,那么可以考虑每个数 \(\mod 2^i\) 后进行加法,如果和 \(\ge 2^i\) 则有进位。
然后无非是一些双指针(暴力),树状数组(莫队)。
当然还需要一些 \(bitset\) 优化等。
但主要的思维量就是这些。

浙公网安备 33010602011771号