信号网络:循环起点与区间异或标记¶
出题人解法:循环起点结合线段树。Codex(GPT-6):整理为标准 C++17 的递归区间访问,明确环绕拆段与位序。程序为 alternative.cpp,作为整数方案的补充,通过完整正式数据。
环形表示¶
物理位置始终不动,记录当前最低位对应的物理起点 \(s\) .逻辑位 \(i\) 对应物理位 \((s+i)\bmod B\) ,本题 \(B=128\) .循环右移 \(k\) 位时,只需令 \(s\leftarrow(s+k)\bmod B\) .
将要取反的逻辑区间映射到物理环上,按长度展开;若跨过末端,就拆成末尾和开头两段。每段在线段树上进行区间取反。
线段树如何表示位¶
每个线段树结点只保存一个异或标记,表示其区间整体被翻转的奇偶性。区间完全被更新覆盖时翻转这个标记;部分覆盖时递归相交孩子。无需向下推送标记。
一个物理位的值等于从根到对应叶子的全部标记异或。查询时携带祖先标记的异或,递归到需要读取的叶子,将每个位放入相应的输出位。取反区间的线段树分解恰好覆盖更新位置,因此被覆盖叶子的根到叶路径恰好多经过一次翻转,其他叶子不变。
查询逻辑最低 \(W=16\) 位时,也按环绕拆成至多两段。后一段的结果左移前一段的长度,再按位或合并。物理起点的映射保证两段中每个位都恢复到正确逻辑位序。相邻查询之间若没有任何修改,可以复用缓存答案。
复杂度与取舍¶
令 \(R,F,Q\) 分别为旋转、取反、查询次数。建立标记数组为 \(O(B)\) ;旋转为 \(O(1)\) ;取反为 \(O(\log B)\) ;未缓存查询访问两个边界路径及至多 \(W\) 个叶子,为 \(O(\log B+W)\) .总时间上界为
空间为 \(O(B)\) ,递归深度为 \(O(\log B)\) .缓存命中只需常数时间。这里 \(B,W\) 固定,所以总时间也随操作数线性增长,但区间遍历的常数比两个机器字大。它的价值在于把旋转与物理存储分离,展示更一般的环形区间思路;本题首选直接字运算。