9.18 模拟赛

https://mna.wang/contest/1412/problem/3

很好很好的计数题。

给定一个 \(n \times m\) 的网格图,其中 . 表示空地,# 表示障碍物。

你需要选出恰好两个不同的障碍物,将它们变成空地,使得操作完成后,节点 \((1, 1)\)\((n, m)\) 恰好通过空地四联通,保证初始时 \((1, 1)\)\((n, m)\) 不为障碍物,请你输出方案数。

\(n,m \le 1000\)

首先如果原本 \((1, 1)\)\((n, m)\) 就连通那么简单特判掉即可。以下讨论的都是 \((1, 1), (n, m)\) 不得不炸若干障碍物后才能连通的情况。

我们给每个连通块一个编号。\((i, j)\) 所在的连通块的编号为 \(col_{i, j}\)

我们思考将两个什么样的障碍物炸掉后能让 \((1, 1), (n, m)\) 连通。分类讨论。

一种情况是其中一个障碍物是特殊点,换言之只需要炸掉这一个障碍物即可连通。那么另一个障碍物显然无限制随便选。

思考什么样的点是特殊点。显然将某个点 \(A\) 炸掉后,原本与 \(A\) 相邻的连通块会合并成一个。我们希望将 \((1, 1), (n, m)\) 连通,也就是将 \(col_{1. 1}\)\(col_{n, m}\) 合并,也就是说 \(A\) 必须与连通块 \(col_{1, 1}, col_{n, m}\) 均相邻。统计这个是极易的。

我们把上面说的特殊点标记。那么在下面的情况中这些被标记的点一定不能被选,否则会算重。我们默认下面说所有点都是没有被标记的。

对于剩下的情况,即只有炸掉两个障碍物才能连通。

首先你做掉这两个障碍物相邻的情况。接下来我们考虑这两个障碍物不相邻的情况。

如果炸掉点 \(A, B\) 后合法,等价于 \(A\) 原本与 \((1, 1)\) 连通,\(B\) 原本与 \((n, m)\) 连通,且 \(A, B\) 与至少一个连通块均连通。换言之存在至少一个连通块 \(C\) 满足 \(A\)\(col_{1, 1}, C\) 相邻且 \(B\)\(col_{n, m}. C\) 相邻。

我们求出与障碍物 \((i, j)\) 相邻的连通块编号组成的集合为 \(S_{i, j}\)显然 \(\mathbf{ |S_{i, j}| \le 4}\)那么问题等价于求:

  • 有多少障碍物 \((i_0, j_0),(i_1,j_1)\) 满足 \(col_{1, 1} \in S_{i_0, j_0}\)\(col_{n, m} \in S_{i_1, j_1}\)\(S_{i_0, j_0} \cap S_{i_1, j_1 } \ne \varnothing\)

我们求出所有满足 \(col_{1, 1} \in S_{i, j}\)\((i, j)\) 组成的集合为 \(A\),满足 \(col_{n, m} \in S_{i, j}\)\((i, j)\) 组成的集合为 \(B\)。显然 \(A, B\) 没有交集(有交集会在最开始被特判掉)。上面的问题等价于:

  • 求有多少 \(v \in A, u \in B\) 满足 \(S_v \cap S_u \ne \varnothing\)

集合?交集?大小 \(\le 4\)?容斥!

做完了。

posted @ 2024-09-19 22:41  2huk  阅读(52)  评论(0编辑  收藏  举报