、

P7274-草地

题意

给出 \(n\times m\) 的黑白网格图,每一秒可以选择一个上下左右的方向,使得所有黑格向这个方向延伸一格,求最少几秒可以使所有黑格八连通。

\(n,m\le 1000\)

思路

考虑最后一步,如果选择上/左那么选择下/右一定也能连通,那么退回到上一个状态也是同理的能在同一秒进入一个“必胜态”。所以我们只需要考虑使用下/右操作即可。

考虑如果是 \(t\) 秒,使用了 \(a\) 个下操作,那么对于每一个黑点会覆盖成一个宽 \(a\) 长 \(t-a\) 的一个矩形。我们可以考虑对于任意两个黑点连一个 \((|x_i-x_j|-1,|y_i-y_j|-1)=(p_{i,j},q_{i,j})\) 的边,那么我们相当于要求出一个 \(\max \{ p \}+\max \{ q \}\) 的最小生成树的权值。那么转化成了 LCT 板子题。考虑按 \(p\) 排序,然后对于目前维护 \(\max \{ p \}\),将这个边权以内的值加入 lct 维护的最小生成树,然后维护每一个时刻上面答案的最小值。

但是发现还是不行,因为黑点的个数 \(V=n\cdot m\) 的,所以边数是 \(V^2\) 时间复杂度 \(\mathcal{O}(n^2m^2\log(nm))\) 的比较坏。

那么为了考虑优化个东西,考虑是不是所有的边都是有用的。

考虑对于两点 \(u,v\)。我们发现,如果这两个点围成的矩形里面还有一个点 \(c\),那么我们连边 \(u\leftrightarrow c\) 和 \(c\leftrightarrow v\) 一定更优秀。

不妨先考虑左上到右下的连边。如果说现在考虑到一个点 \(u\),考虑左上角的所有点,对于一个最优的点,所有它的左上点也全都不需要有连边。那么我们可以拿单调栈维护。

那么对于同一行的相邻两个点 \(u_1,u_2\),对于 \(u_2\) 来说只可能对行在 \([x_{u_1},x_{u_2}]\) 的每一列最高的黑点连边,所以每一行的边数是 \(\mathcal{O}(m)\) 的,那么因为右上左下同理边的复杂度也就变成了 \(\mathcal{O}(nm)\)。

则最终复杂度变成了 \(\mathcal{O}(nm\log(nm))\)。为了再优化一下,可以直接把已经联通的点都当成一个点来看,那么显然会省去不少的常数。

posted @ 2026-09-24 14:48  tanghg  阅读(6)  评论(0)    收藏  举报