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\)?容斥!
做完了。
标签:障碍物,连通,炸掉,9.18,相邻,le,col,模拟 From: https://www.cnblogs.com/2huk/p/18421520