qwq
题解
本质困难的操作是 + 操作,不过先来考虑没有 + 操作该怎么做。这时每一位互相独立,可以使用线段树加上压位做到 \(O(n)\) 预处理,\(O(\log n)\) 查询。为了给后面的做法做铺垫,考虑另一个 \(O(n\log V)\) 预处理,\(O(1)\) 查询的做法。注意到本质上 & 操作是令某些位变成 \(0\),| 操作是令某些位变成 \(1\),因此可以处理出 \(i\) 时刻及之前第 \(j\) 位上一次被强制修改的时刻 \(pre_{i,j}\) 与只考虑 ^ 操作时的前缀异或,询问时从 \(\max(pre_{r,t},l)\) 开始求一下中间的区间异或值即可。不妨把整个子过程记为 \(F(op, l, r, t)\),其中 \(op=0/1\) 表示第 \(t\) 位的初始值。
接下来看 + 操作。从低位向高位分析,+ 操作在 \(t=0\) 的查询中等同于 ^ 1;\(t=1\) 时所有在最低位进位了的 + 等效于 ^ 1,其余的 + 无影响;以此类推。那么对于一个询问,只需统计其在 \(\max(pre_{r,t},l)\) 时刻之后遇到了多少个生效的(对答案有影响的)+ 即可。但是 + 的生效取决于所有的更低位,从而取决于输入,难以处理。
考虑缩减状态。注意到一个 + 在第 \(t\) 位生效的条件是其低 \(t-1\) 位全为 \(1\),且这次操作后其低 \(t-1\) 位一定全变为 \(0\),从而拥有了足够的信息,使其能够找到下一个在第 \(t\) 位生效的 +。因此可以对按顺序第 \(i\) 个 + 维护 \(f_{i,t}\),表示若其在第 \(t\) 位生效,则下一个在 \(t\) 生效的 + 在所有 + 中的相对位置。为了计算 \(f\) 以及找到从 \(v\) 出发第一次 + 影响第 \(t\) 位的时刻,还需要记录 \(g_{i,t}\) 表示若第 \(i\) 个 + 操作后当前数的二进制下低 \(t\) 位恰形如 100...0(即没能进位到第 \(t+1\) 位)时,下一个能进到第 \(t+1\) 位的 + 操作的位置。
计算 \(f,g\) 时,按 \(t\) 从小到大递推。不妨设 + 有 \(m\) 个,第 \(i\) 个 + 在序列中的位置为 \(pos_i\)。再令 \(m+1\) 为固定的终止结点。\(t=0\) 时,对 \(i\le m\) 有 \(f_{i,t}=i+1\)。现在假设知道了所有 \(f_{i,t}\) 的信息。
-
倒着递推 \(g_{i,t}\)。为了找到下一个能进位到 \(t+1\) 的
+,至少需要找到下一个能进位到 \(t\) 的+。记 \(nxt=f_{i,t}\),忽略中间所有的+,计算 \(F(1, pos_i, pos_{nxt}, t)\),表示到 \(nxt\) 时第 \(t\) 位的值。有两种情况:-
第 \(t\) 位为 \(1\)。再加 \(1\) 就可以进位,因此 \(g_{i,t}=nxt\)。
-
第 \(t\) 位为 \(0\)。再加 \(1\) 无法进位,但能构成
100...0的形状。\(g_{i,t}=g_{nxt,t}\)。
-
-
倒着递推 \(f_{i,t+1}\)。记 \(nxt=f_{i,t}\),计算 \(F(0,pos_i,pos_{nxt},t)\)。与上面完全相同的两种情况:
-
第 \(t\) 位为 \(1\)。此时再加 \(1\) 可以进到 \(t+1\) 位,\(f_{i,t+1}=nxt\)。
-
第 \(t\) 位为 \(0\)。再加 \(1\) 能构成
100...0的形状,\(f_{i,t+1}=g_{nxt,t}\)。
-
由此可以 \(O(n\log V)\) 地计算出所有的 \(f,g\)。
剩下的部分是处理询问。从时刻 \(l\) 开始,先跳到后面第一个 +,记这个 + 最多进到了 \(t'\) 位。若 \(t'<t\),则不断跳 \(g\) 数组,直到 \(t'\ge t\)。精细实现可以使 \(\le t\) 的每一位只被计算一次 \(F\),这部分复杂度 \(O(\log V)\)。接下来不断跳 \(f\) 直到越过 \(pre_{r,t}\),然后不断跳 \(f\) 直到将要越过 \(r\),跳的过程需要优化。由于空间较紧,可以使用树剖实现至 \(O(\log n)\)。最后统计一共跳了几步,贡献到答案即可。总复杂度 \(O(n\log V+q(\log n+\log V))\),可以通过。

浙公网安备 33010602011771号