题解 CF1004F 【Sonya and Bitwise OR】
简单数据结构题?
我们先考虑一个朴素分治。
\([l, mid]\) 和 \([mid + 1, r]\) 递归求解。
\([l,r]\) 的区间需要通过 \([l, mid]\) 的后缀和 \([mid+1,r]\) 的前缀来求解。
第一次枚举前者的后缀然后移动后者,第二次枚举后者然后移动前者。
这样的复杂度是 \(n \log n\) 但是只能支持一次询问(bushi)。
但是我们发现由于 \(OR\) 的性质,不会变化超过 \(\log\) 次。所以我们考虑线段树在每个节点记录一下是哪些位置让这个发生了改变。
我们记录一个 \(st\) 表示区间 \([l,r]\) 从 \(l\) 开始计算,会变化的位置以及长度。
同理我们记录一个 \(ed\) 表示区间 \([l,r]\) 从 \(r\) 开始计算,会变化的位置以及长度。
显然这个信息是可以在线段树上面合并的,每次计算当前区间的复杂度也只需要 \(\log^2\)。
然后这题就做完了。