题解:XOR and OR
喵仔牛奶
·
·
题解
Solution
考虑拆位。考虑求出按位或和为 0 的区间数,用总区间减去这些就是按位或和为 1 的区间数。
显然,按位或和为 0 等价于区间内全部为 0。线段树维护左边和右边最长的 0 连续段长度 L,R、区间内按位或和为 0 的区间数 s、区间数反转后(01 互换)的积 w。
线段树合并信息 (L,R,s,w)(L',R',s',w') 时:
\begin{cases}
s''=s+s'+R'\times L\\
L''=w\times L'+L\\
R''=w'\times R+R'\\
w''=w\times w'
\end{cases}
由于有区间 01 反转,还要维护区间 01 反转后的答案。
这样直接做是 \mathcal O(n\log n\log V) 的,无法通过。
考虑求的是异或和,即模 2 的结果。加法和乘法在模 2 意义下等价于按位异或、按位与。因此,将每位的线段树的信息压到一个数里面,合并时将加法改为异或、乘法改完按位与即可。
复杂度 \mathcal O(n\log n)。代码很好写,就不放了。