1 条题解
-
0
题目大意
我们有一个的 01 矩阵。
- 定义 为行异或值为 1 的行数(即该行所有元素按位异或结果为 1)。
- 定义 为列异或值为 1 的列数(即该列所有元素按位异或结果为 1)。
一次操作:选择矩阵中的一个元素,将它 翻转(0 变 1,1 变 0)。
目标是让 且,即所有行异或和都为 0,所有列异或和都为 0。
问最少操作次数是多少。
关键观察
设矩阵元素为 。
第 行的异或和:
$$R_i = a_{i1} \oplus a_{i2} \oplus \dots \oplus a_{im} $$第 列的异或和:
$$C_j = a_{1j} \oplus a_{2j} \oplus \dots \oplus a_{nj} $$根据标程的思路,当我们翻转元素:
- 这一行的异或值会翻转(因为 变为 )。
- 这一列的异或值也会翻转(因为 变为 )。
因此,一次操作会同时改变:
- 某一行在行异或为 1 的行数 的变化量是 ±1
- 某一列在列异或为 1 的列数 的变化量是 ±1
也就是说,一次操作会同时让 和 各自变化 。
重要性质
由异或的性质可知:
- 所有行异或和的总异或值(对 再异或一次)等于 所有列异或和的总异或值。
- 其实更直接:
矩阵所有元素的总异或值 = 各行的异或值再异或
矩阵所有元素的总异或值 = 各列的异或值再异或
由此可得一个重要结论:
$$\text{(行异或值为 1 的行数)} \bmod 2 = \text{(列异或值为 1 的列数)} \bmod 2 $$因为:
- 所有行异或值的异或 = 矩阵所有元素的总异或
- 所有列异或值的异或 = 矩阵所有元素的总异或
- 所以行异或值和列异或值的奇偶性相等。
即
这个结论与题解给出的“不可能情况”无关(因为题中没给不可能情况),而是用于辅助推导最小操作次数。
最少操作次数推导
设初始时 和 如上定义。
我们需要最终。一次操作使 和 各自变化 1(增加或减少),所以变化量记为 $ (\Delta r, \Delta c) \in \{(-1,-1), (-1,1), (1,-1), (1,1)\} $,取决于翻转的元素是否在原来行异或为 1 的行和列异或为 1 的列中。
目标是让。
一种贪心策略:
- 如果 ,那么我们可以每次选择在某个行异或为 1 的行,列异或为 0 的列(即该行列异或状态不同)上操作,这样会使 减少 1, 增加 1,直到 。
- 当 时,如果 ,一次操作可以同时减少 和 各 1,所以还需要 次。
- 如果初始 ,同理先通过操作把 拉到 ,再同步减少。
总次数:
因为:
- 每次只能减少 中的一个,或者同时减少两者。
- 最少的次数就是先减少较大的那个,直到相等,再同步减少。
正确性说明
假设,我们先选一个行异或为 1 的行的某个列异或为 0 的列(一定存在吗?不一定总存在,但我们可以构造策略,或者通过全异或相等条件确保能到终点)。
实际上,我们可以考虑更简单的数学归纳:
- 当 时,次数为 0。
- 当 时,可以一步让 减少 1 且 增加 1(如果可行),这样 减少 2,直到 。
- 当 时,可以一步让 和 都减 1。
- 所以需要的步数正好是。
时间复杂度
计算 和 :
- 对每行做异或和:
- 对每列做异或和:
总复杂度 ,符合题意。
与标程对照
标程中:
- 先读入矩阵,存为 bool
- 分别计算 和
- 输出
没有特殊处理,因为题目保证有解(即满足奇偶性条件),所以直接输出 即可。
最终题解公式化
其中
$$r = \sum_{i=1}^n \left( \bigoplus_{j=1}^m a_{ij} \right) $$$$c = \sum_{j=1}^m \left( \bigoplus_{i=1}^n a_{ij} \right) $$这里 表示按位异或,求和是把 true 值当 1 计数。
- 1
信息
- ID
- 6407
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者