题解: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)\)

link

posted @ 2025-06-18 10:23  薛儒浩  阅读(63)  评论(0)    收藏  举报