CF1004F 题解
题意
给定数组 \(a_{1 \sim n}\) 和 \(m\) 次操作,操作分两类:
- 将 \(a_x\) 修改为 \(y\);
- 给定 \(L,R\),询问有多少区间 \([l,r]\) 满足 \(L \le l \le r \le R\) 且 \(a_{l \sim r}\) 的按位或和 \(\ge x\)。
\(1 \le n,m \le 10^5,0 \le a_i,x,y < 2^{20}\)
题解
由于按位或的单调性,不难想到尺取,配合线段树可以 \(O(nm \log n)\)。
但这样还不够。注意到另一个有趣的性质:若左端点固定,只有 \(\log n\) 种不同的值。
于是思考 \(O(n \log^2 n)\) 的做法。显然,若答案支持 \(O(\log n)\) 区间合并,则可以用线段树解决。
记录区间前缀/后缀按位或和的转折点和值,首先答案容易维护。还需要更新的前/后缀按位或和。
以前缀和为例,首先继承左区间的前缀和。接着依次枚举右区间的所有前缀和,尝试和已得到的前缀和的最后一位匹配(就是按位或后不变),若成功则加上长度,失败则加入。于是成功解决问题。