1 条题解
-
0
B. Corner Twist 详细题解
题目重述
给定两个 的网格 和 ,每个格子取值 。允许的操作:选择一个至少 的子矩形(即边长 ),将其四个角中的一对对角(例如左上和右下)加 (模 ),另一对对角(右上和左下)加 (模 )。问能否通过任意次操作将 变成 。
操作的本质
设操作作用于子矩形,其四个角坐标为 (左上)、(右上)、(左下)、(右下)。我们可以选择两种方式之一:
- 方式一:左上、右下 ;右上、左下 。
- 方式二:左上、右下 ;右上、左下 。
注意两种方式实际上是互逆的(因为 和 模 下互为相反数:)。因此每次操作可以看作是在四个角上施加一个向量:
$$(+1, +2, +2, +1) \quad \text{或} \quad (+2, +1, +1, +2) $$若定义目标差值 (取值 ),则我们需要通过若干次上述操作,使得所有 变为 。
关键观察
- 模 线性性:操作对每个格子施加的变化是模 可加的,因此问题转化为:能否用给定的“操作向量”的整数线性组合(系数在 模 意义下)表示差值矩阵 。
- 局部性:每个操作只影响一个 子矩形的四个角。这类似于在网格上对“单位正方形”施加一个模式。
- 自由度:如果我们对每个 子矩形独立地决定操作次数(模 ),则可以消去除了最后一行和最后一列之外的所有格子。这是因为:
- 从左到右、从上到下遍历,对于每个位置 (, ),我们可以用以 为左上角的操作来调整 的值,将其归零。
- 具体地,若当前 ( 或 ),则我们需要使用 次“方式一”(或相应次数的组合)来消除它。该操作会影响 , , , 。
贪心调整过程
设当前处理到位置 ,其中 , 。我们只关心差值矩阵 。过程如下:
- 若 ,跳过。
- 否则,设 。我们执行以 为左上角的操作,其中:
- 对 和 加上 (模 );
- 对 和 加上 模 。 注意: 当 时为 ,当 时为 。这正好对应两种操作方式:若 则为方式一(左上右下加 ,其它加 );若 则为方式二(左上右下加 ,其它加 )。
执行后, 变为 。然后继续处理下一个位置。
当处理完所有 后,最后一行和最后一列(即 或 )的差值可能非零。但注意,我们无法再通过任何操作来改变它们,因为任何操作都会影响一个 子矩形,而最后一行和最后一列只能作为子矩形的下边界或右边界。然而,这些位置的值实际上已经被前面操作间接决定了。我们需要检验它们是否全部为 。
必要条件与充分性
上述贪心过程给出了一种构造方法:如果经过所有左上角 个位置的调整后,最后一行和最后一列的所有 均为 ,则原问题有解,且该过程直接给出了操作序列(操作次数模 )。反之,如果最后一行或最后一列有非零值,则无解。
这是因为所有操作的影响可以用线性代数描述。整个差分网格的“可消去部分”的秩为 ,而最后一行和最后一列是“约束条件”。实际上,初始差值矩阵 必须满足一个守恒条件:所有 的某种交错和为零。更具体地,考虑对每个 子矩形,四个角满足某种线性关系。但通过贪心法,我们能够直接判断可行性。
正确性证明
- 每个操作保持某个不变量:设对所有 定义 。观察操作对最后一行和最后一列的影响:每次操作只改变四个角,而最后一行和最后一列上的差值变化是相互关联的。事实上,可以证明网格中所有元素的和模 并非不变量,但存在一个更精细的约束:经过贪心过程后,最后一行和最后一列的值完全由初始 决定,且若它们不全为零,则无法通过任何操作消除(因为任何操作都会同时改变这些边界上的若干位置,而贪心已用尽了所有自由度)。这类似于高斯消元法在网格上的应用。
- 贪心法的正确性:由于我们按行主序处理,每次操作只影响当前格子 以及右侧、下方、右下角的格子,不会破坏已经处理过的左上部分(因为已经归零的位置不会再被后续操作影响,后续操作只涉及 且 ,不会回溯)。因此,最终所有左上 区域均为 。此时,最后一行和最后一列的值是唯一可能非零的。如果它们恰好全为 ,则我们成功将整个 归零,说明原问题有解。
- 充分性:若最后一行和最后一列全为零,则给出了具体的操作方案(每个 上执行 次操作)。由于每次操作合法(子矩形边长至少 ),且操作次数有限,因此 可以变为 。
- 必要性:若最后一行或最后一列存在非零值,假设存在解,则可通过反向操作(逆操作也是相同形式的操作)将 变回 ,从而得到一组操作能将差值矩阵 归零。但任何操作序列都可以化为按上述顺序消元的过程,最终最后一行和最后一列必然为零,矛盾。因此不满足该条件的 一定无解。
算法步骤
- 计算差值矩阵 。
- 对 到 ,对 到 :
- 若 ,设 ,执行:
- 若 ,设 ,执行:
- 检查所有 是否均为 。若是,输出
"YES",否则"NO"。
时间复杂度
- 每个测试用例 ,且所有测试用例的 总和不超过 ,完全可行。
- 空间复杂度 。
示例分析
以第一个测试用例为例: 全 , 全 ,则 ()。按贪心:
- 处 ,执行操作,更新后 变为:,最终所有位置归零,可行。
第四个测试用例输出
"NO",说明经贪心后最后一行或最后一列存在非零值。总结
本题的核心是将模 下的矩阵差值转化为一个可局部消元的问题。利用 操作的基础性,我们能够通过贪心法在 时间内判定可行性,并构造出操作序列(虽然题目只要求判断是否可行,但同样的方法可输出方案)。该解法简洁高效,是这类网格操作问题的经典处理方法。
- 1
信息
- ID
- 6918
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者