1 条题解

  • 0
    @ 2026-5-5 15:36:12

    B. Corner Twist 详细题解

    题目重述

    给定两个 n×mn \times m 的网格 aabb,每个格子取值 0,1,20,1,2。允许的操作:选择一个至少 2×22\times 2 的子矩形(即边长 2\ge 2),将其四个角中的一对对角(例如左上和右下)加 11(模 33),另一对对角(右上和左下)加 22(模 33)。问能否通过任意次操作将 aa 变成 bb

    操作的本质

    设操作作用于子矩形,其四个角坐标为 (i,j)(i,j)(左上)、(i,j+1)(i, j+1)(右上)、(i+1,j)(i+1, j)(左下)、(i+1,j+1)(i+1, j+1)(右下)。我们可以选择两种方式之一:

    • 方式一:左上、右下 +1+1;右上、左下 +2+2
    • 方式二:左上、右下 +2+2;右上、左下 +1+1

    注意两种方式实际上是互逆的(因为 +1+1+2+233 下互为相反数:21(mod3)2 \equiv -1 \pmod{3})。因此每次操作可以看作是在四个角上施加一个向量:

    $$(+1, +2, +2, +1) \quad \text{或} \quad (+2, +1, +1, +2) $$

    若定义目标差值 di,j=(bi,jai,j)mod3d_{i,j} = (b_{i,j} - a_{i,j}) \bmod 3(取值 0,1,20,1,2),则我们需要通过若干次上述操作,使得所有 di,jd_{i,j} 变为 00

    关键观察

    1. 33 线性性:操作对每个格子施加的变化是模 33 可加的,因此问题转化为:能否用给定的“操作向量”的整数线性组合(系数在 {0,1,2}\{0,1,2\}33 意义下)表示差值矩阵 dd
    2. 局部性:每个操作只影响一个 2×22\times 2 子矩形的四个角。这类似于在网格上对“单位正方形”施加一个模式。
    3. 自由度:如果我们对每个 2×22\times 2 子矩形独立地决定操作次数(模 33),则可以消去除了最后一行和最后一列之外的所有格子。这是因为:
      • 从左到右、从上到下遍历,对于每个位置 (i,j)(i,j)i<ni < n, j<mj < m),我们可以用以 (i,j)(i,j) 为左上角的操作来调整 di,jd_{i,j} 的值,将其归零。
      • 具体地,若当前 di,j=xd_{i,j} = xx=1x = 122),则我们需要使用 xx 次“方式一”(或相应次数的组合)来消除它。该操作会影响 (i,j)(i,j), (i,j+1)(i,j+1), (i+1,j)(i+1,j), (i+1,j+1)(i+1,j+1)

    贪心调整过程

    设当前处理到位置 (i,j)(i,j),其中 1in11 \le i \le n-1, 1jm11 \le j \le m-1。我们只关心差值矩阵 dd。过程如下:

    • di,j=0d_{i,j} = 0,跳过。
    • 否则,设 val=di,j{1,2}val = d_{i,j} \in \{1,2\}。我们执行以 (i,j)(i,j) 为左上角的操作,其中:
      • (i,j)(i,j)(i+1,j+1)(i+1,j+1) 加上 valval(模 33);
      • (i,j+1)(i,j+1)(i+1,j)(i+1,j) 加上 2val2 \cdot val33。 注意:2valmod32 \cdot val \bmod 3val=1val=1 时为 22,当 val=2val=2 时为 11。这正好对应两种操作方式:若 val=1val=1 则为方式一(左上右下加 11,其它加 22);若 val=2val=2 则为方式二(左上右下加 22,其它加 11)。

    执行后,di,jd_{i,j} 变为 00。然后继续处理下一个位置。

    当处理完所有 i<n,j<mi<n, j<m 后,最后一行和最后一列(即 i=ni=nj=mj=m)的差值可能非零。但注意,我们无法再通过任何操作来改变它们,因为任何操作都会影响一个 2×22\times 2 子矩形,而最后一行和最后一列只能作为子矩形的下边界或右边界。然而,这些位置的值实际上已经被前面操作间接决定了。我们需要检验它们是否全部为 00

    必要条件与充分性

    上述贪心过程给出了一种构造方法:如果经过所有左上角 (n1)×(m1)(n-1)\times(m-1) 个位置的调整后,最后一行和最后一列的所有 di,jd_{i,j} 均为 00,则原问题有解,且该过程直接给出了操作序列(操作次数模 33)。反之,如果最后一行或最后一列有非零值,则无解。

    这是因为所有操作的影响可以用线性代数描述。整个差分网格的“可消去部分”的秩为 (n1)×(m1)(n-1)\times(m-1),而最后一行和最后一列是“约束条件”。实际上,初始差值矩阵 dd 必须满足一个守恒条件:所有 di,jd_{i,j} 的某种交错和为零。更具体地,考虑对每个 2×22\times 2 子矩形,四个角满足某种线性关系。但通过贪心法,我们能够直接判断可行性。

    正确性证明

    1. 每个操作保持某个不变量:设对所有 i,ji,j 定义 si,j=di,js_{i,j} = d_{i,j}。观察操作对最后一行和最后一列的影响:每次操作只改变四个角,而最后一行和最后一列上的差值变化是相互关联的。事实上,可以证明网格中所有元素的和模 33 并非不变量,但存在一个更精细的约束:经过贪心过程后,最后一行和最后一列的值完全由初始 dd 决定,且若它们不全为零,则无法通过任何操作消除(因为任何操作都会同时改变这些边界上的若干位置,而贪心已用尽了所有自由度)。这类似于高斯消元法在网格上的应用。
    2. 贪心法的正确性:由于我们按行主序处理,每次操作只影响当前格子 (i,j)(i,j) 以及右侧、下方、右下角的格子,不会破坏已经处理过的左上部分(因为已经归零的位置不会再被后续操作影响,后续操作只涉及 iii' \ge ijjj' \ge j,不会回溯)。因此,最终所有左上 (n1)×(m1)(n-1)\times(m-1) 区域均为 00。此时,最后一行和最后一列的值是唯一可能非零的。如果它们恰好全为 00,则我们成功将整个 dd 归零,说明原问题有解。
    3. 充分性:若最后一行和最后一列全为零,则给出了具体的操作方案(每个 (i,j)(i,j) 上执行 valval 次操作)。由于每次操作合法(子矩形边长至少 22),且操作次数有限,因此 aa 可以变为 bb
    4. 必要性:若最后一行或最后一列存在非零值,假设存在解,则可通过反向操作(逆操作也是相同形式的操作)将 bb 变回 aa,从而得到一组操作能将差值矩阵 dd 归零。但任何操作序列都可以化为按上述顺序消元的过程,最终最后一行和最后一列必然为零,矛盾。因此不满足该条件的 dd 一定无解。

    算法步骤

    1. 计算差值矩阵 di,j=(bi,jai,j+3)mod3d_{i,j} = (b_{i,j} - a_{i,j} + 3) \bmod 3
    2. i=0i = 0n2n-2,对 j=0j = 0m2m-2
      • di,j0d_{i,j} \neq 0,设 x=di,jx = d_{i,j},执行:
        • di,j0d_{i,j} \leftarrow 0
        • di+1,j(di+1,j+2x)mod3d_{i+1,j} \leftarrow (d_{i+1,j} + 2x) \bmod 3
        • di,j+1(di,j+1+2x)mod3d_{i,j+1} \leftarrow (d_{i,j+1} + 2x) \bmod 3
        • di+1,j+1(di+1,j+1+x)mod3d_{i+1,j+1} \leftarrow (d_{i+1,j+1} + x) \bmod 3
    3. 检查所有 di,jd_{i,j} 是否均为 00。若是,输出 "YES",否则 "NO"

    时间复杂度

    • 每个测试用例 O(nm)O(n \cdot m),且所有测试用例的 n×mn \times m 总和不超过 500×500=2.5×105500 \times 500 = 2.5 \times 10^5,完全可行。
    • 空间复杂度 O(nm)O(n \cdot m)

    示例分析

    以第一个测试用例为例:aa00bb11,则 d=[1,1,1;1,1,1;1,1,1]d = [1,1,1; 1,1,1; 1,1,1]3×33\times 3)。按贪心:

    • (0,0)(0,0)d=1d=1,执行操作,更新后 dd 变为:[0,1+2=0?,需具体计算][0, 1+2=0?, 需具体计算],最终所有位置归零,可行。

    第四个测试用例输出 "NO",说明经贪心后最后一行或最后一列存在非零值。

    总结

    本题的核心是将模 33 下的矩阵差值转化为一个可局部消元的问题。利用 2×22\times 2 操作的基础性,我们能够通过贪心法在 O(nm)O(nm) 时间内判定可行性,并构造出操作序列(虽然题目只要求判断是否可行,但同样的方法可输出方案)。该解法简洁高效,是这类网格操作问题的经典处理方法。

    • 1

    信息

    ID
    6918
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者