Educational Codeforces Round 173 (Rated for Div. 2) E
CF2043E
题意
给定两个 \(n\times m\) 的矩阵 \(A\) 和 \(B\)(其中的整数介于 \(0\) 和 \(10^9\) 之间),可以对 \(A\) 矩阵进行如下操作,问是否能变换为矩阵 \(B\)。
- \(\&=\):选择两个整数 \(i\) 和 \(x \ (1 \leq i \leq n, x \geq 0)\),并将第 \(i\) 行中的每个元素替换为 \(x\) 与该元素 \(\text{and}\) 运算的结果。
- \(|=\):选择两个整数 \(j\) 和 \(x \ (1 \leq j \leq m, x \geq 0)\),并将第 \(j\) 列中的每个元素替换为 \(x\) 与该元素 \(\text{or}\) 运算的结果。
数据范围:\(1 \leq n, m \leq 10^3\),\(1 \leq n \cdot m \times 10^3\)。
做法
前置知识:差分约束系统。
按位考虑。在某一位的情况下考虑问题,操作等价替换为:
1、将某一行的元素全部变为 \(0\);
2、将某一列的元素全部变为 \(1\)。
显然每一行 / 每一列均至多操作一次。
考虑给行、列操作定义执行顺序,则容易发现,若 \(A\) 中某元素 \((i, j)\) 要从 \(1\) 变为 \(0\),等价于对行 \(i\) 的操作一定要后于列 \(j\),反过来也是类似。
那么,\(A\) 中元素若需要修改,则等价于给两个变量确定一个大小关系。
这让我们联想到差分约束系统。
但实际上,就算 \(A\) 中元素不需要修改,也可能需要满足某些变量之间的大小关系,具体来说:若 \(A\) 在某位置上为 \(0\) 且不需要修改,则需要考虑若该列修改过,那么该行的操作必须后于列 \(j\),若列 \(j\) 未操作,则无要求,反过来也是类似。
因此,对于是否操作过某行 / 某列打个标记,每次确定要修改某行 / 某列时也需判断该行 / 该列的其他元素是否额外增加了约束条件。
最后跑个 spfa 判断是否有负环即可。
时间复杂度:\(\mathcal O\left(T\log X \cdot (n + m) nm \right)\)(实际上远远到不了此上限)。
评测链接。