题解:P12846 [蓝桥杯 2025 国 A] 翻转硬币
题目的三类局部翻转与一类整体翻转,其本质都可以抽象为“在一次区间操作里,把若干固定同余类的硬币状态取反”。
将下标对 \(6\) 取模后可得到 \(0,1,2,3,4,5\) 六个同余类:
- 当步长为 \(2\) 时,只会落在奇数类 \(\{1,3,5\}\) 或偶数类 \(\{0,2,4\}\);
- 当步长为 \(3\) 时,只会落在下标同余 \(x\bmod 3\) 的两类;
- 而整段翻转则覆盖全部六类。
于是:
- 操作 \(1\) 等价于把奇类或偶类整体取反;
- 操作 \(2\) 等价于把与 \(x\bmod 3\) 相同的两类整体取反;
- 操作 \(3\) 等价于把六个类全部取反;
查询操作仅需统计六类的正面计数之和。
基于此,在一棵线段树的每个结点维护长度为 \(6\) 的数组,记录对应区间六个同余类的正面硬币数量,并用一个 \(6\) 位二进制掩码做懒标记,表示“本区间哪些类尚待取反”。
当需要把某类取反时,只需将计数 \(c\) 更新为区间内该类长度 \(l\) 减去 \(c\),并把掩码按位异或相应常量;下推和合并时每次都只是对这六个整数做常数级别的运算,因此一次区间更新或查询仍是 \(O(\log n)\) 量级。
掩码常量可以预先写死:奇类为二进制 \(011010_2\),偶类为 \(101001_2\),三种 \(\bmod 3\) 类分别是 \(000100_2\)、\(001010_2\)、\(010001_2\),全翻则是 \(111111_2\)。
时间复杂度 \(O\bigl(n + m\log n\bigr)\)。

浙公网安备 33010602011771号