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)\)(实际上远远到不了此上限)。

评测链接

posted @ 2024-12-25 22:15  chzhc  阅读(31)  评论(0)    收藏  举报
levels of contents