CF632F - Magic Matrix 题解

(2021.1.1 前 AC 800 祭!)


先讲一个暴力做法。

前两个条件直接跑。最后一个条件,就是说在 \(i,j\) 这两列中,画 \(n\) 条水平线经过的两个位置,不能全部 \(<a_{i,j}\)。这个事情可以用 bitset 来优化。我们将 \(a_{i,j}\) 从小到大排序,实时在 bitset 里更新 \(<a_{i,j}\) 的,然后 bitset & 一下即可。

复杂度三方除以 \(w\)


然后是正解。

注意到前两条限制满足了,这个矩阵可以看作一个邻接矩阵,值是边权。于是试图往图论去转化(一般转化到图论都是很需要思维的,例如某 flip)。

我们将第三条稍微转化一下,将 \(a_{j,k}\leq\max(a_{j,o},a_{k,o})\) 代入可得 \(a_{i,j}\leq\max(a_{i,j},a_{j,o},a_{k,o})\)。代入更多次可以得到一个等价条件:\(a_{i,j}\) 不是任意一个包含 \((i,j)\) 的环上的严格最大值。

这跟 MST 的某些性质很像:树边不是任意一个包含它自身的加上一条非树边形成的环上的严格最大值。于是我们考虑求出 MST,之后怎么做呢。那么显然树边都不需要被检查了,检查非树边的时候,直觉告诉我们应该检查以它为两端的树上路径的 \(\max\)。这很好证明:必要性显然的吧;充分性呢,可以归纳证,\(x\to y\) 的路径中,一定是树上路径的边 \(\max\) 非严格最小。

求最小生成树呢,有 \(m=n^2\),那么 Kruskal 是 \(\mathrm O(m\log m)\),Prim 是 \(\mathrm O\!\left(n^2\right)\)。可见在这个完全图中,反而是 Prim 更优了。

(蒟蒻第一次写 Prim 呢,请多多指教)u1s1 Prim 还真是巨好写。

code: Kruskal Prim

posted @ 2020-12-26 22:02  ycx060617  阅读(114)  评论(0编辑  收藏  举报