CF1004F 题解

题意

传送门

给定数组 \(a_{1 \sim n}\)\(m\) 次操作,操作分两类:

  1. \(a_x\) 修改为 \(y\)
  2. 给定 \(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)\) 区间合并,则可以用线段树解决。

记录区间前缀/后缀按位或和的转折点和值,首先答案容易维护。还需要更新的前/后缀按位或和。

以前缀和为例,首先继承左区间的前缀和。接着依次枚举右区间的所有前缀和,尝试和已得到的前缀和的最后一位匹配(就是按位或后不变),若成功则加上长度,失败则加入。于是成功解决问题。

posted @ 2022-11-09 20:29  realFish  阅读(26)  评论(0)    收藏  举报