【ULR #2】Picks loves segment tree IX

下面是口胡题解

考虑如果一段操作没有 +1 操作,容易预处理求出某一位的变化情况(0/1/rev/不变)。

如果有 +1 操作,影响效果是 bitxor 11111 ,但似乎难以知道这个操作的影响。

考虑进位一次以后,变成了 ?00000。(但上面会往上 +1 ,可能会产生新的 0)

考虑两个数组 \(f,g\)

\(f(i,j)\) 表示某次 +1 后第 \(j\) 位以下变成 0000 ,到第 \(f(i,j)\) 的 +1 操作后第 \(j\) 位以下再次变成 0000

\(g(i,j)\) 表示某次 +1 后第 \(j+1\) 位以下变成 10000 ,到第 \(g(i,j)\) 的 +1 操作后第 \(j\) 位以下变成 00000 (多一个 0)

每次询问的时候:

从当前位置跳 \(g(i,j)\) ,跳到某次 +1 进位影响到询问的那一个位。

接下来变成了 x00000 ...

接下来跳 \(f(i,j)\) ,每次跳一个 \(f(i,j)\) 的+1操作就会把询问的那个位影响 xor 1,其他的 +1 操作是没影响的。(当然跳的中间询问的位也会改变,但是这个影响是容易查询的。)

(主要思想就是考虑询问的位一定会在每个 \(f(i,j)\) 的+1操作时被影响。)

可以把 \(i\to f(i,j)\) 变成一颗树然后树剖优化查询。


posted @ 2022-01-11 11:20  Rainbow_qwq  阅读(94)  评论(0编辑  收藏  举报