[Luogu 10856] Xor Forces

有一个长度为 \(n = 2^m\) 的序列 \(a_1, a_2, \dots, a_n\)

\(q\) 次询问,每次给定 \(l, r, v\),令 \(b_i = a_{i \oplus v}\),求 \(b_l, b_{l+1}, \dots, b_r\) 的颜色段个数。强制在线。

如果下标不需要对 \(v\) 异或,那么是容易的,直接线段树即可。

如果有交换律,那么是容易的,直接 01Trie 即可。若 \(v\) 二进制下的第 \(k\) 位(最低位为第 \(0\) 位)为 \(1\),则 01Trie 需要在这一位交换左右子树,否则不需要。

一个很直接的想法是建立可持久化线段树:若 \(v\) 的最高位 \(1\) 出现在第 \(k\) 位,即 \(\lfloor \log_2 v \rfloor = k\),那么主席树第 \(v\) 个版本的信息将会从第 \(v \oplus 2^k\) 个版本中继承并更新。

考虑计算时间复杂度,枚举 \(k\),对于每个 \(\lfloor \log_2 v \rfloor = k\)\(v\),会访问并新建 \(O(2^{m-k})\) 个节点,而有 \(2^k\) 个这样的 \(v\),因此预处理总复杂度为 \(O(2^m m) = O(n \log n)\)

posted @ 2025-08-27 19:44  SZwinsun  阅读(4)  评论(0)    收藏  举报