CF2098C 解题报告
题目概述
在一个 \(n*m\) 的平面上,有一条通过四连通形成的长 \(2k+1\) 的路径。现在给出所有奇数位置的坐标,求可能的路径数量。
赛时分析
首先考虑最简单的情况:两个编号相邻的点,如果可行,那么它们的曼哈顿距离一定为 \(2\)。在此基础上,如果它们的横(纵)坐标相同,那么显然就一种方案;如果它们的横纵坐标都不相同,那么就有两种情况。
所以答案一定是 \(2\) 的若干次方?
但是很快,我们发现,如果存在像 \((1,2) \rightarrow (2,3) \rightarrow (3,2)\) 这样的坐标序列,那么这三个点一共只有 \(3\) 种方案,这便使我们刚刚”感性“理解得出结论推翻了。再次观察,我们发现这类不符合上述规律的点集,它们之所以会不满足条件,是因为其中一个点本来可以任意选取的空点被其他点占用了。
因此我们考虑,如果两个斜相邻的点,将它们可以选用的空点合并到一个并查集中,那么上述点集的空点一定在同一个并查集中。暴力枚举每一个点集,用搜索遍历每一种可能空点分配方案,最后所有点集分配方案的乘积就是答案。
但是遗憾 \(\text{WA}\)
题解
其实已经接近了。
Trick:将斜相邻的点可以选用的空点之间连边,然后给边定向(由不选的指向被选的),需要保证每一个点只有一条入边
很巧妙的方法!
接下来是分类讨论:
对于一个大小为 \(sz\) 的连通块:
-
如果该连通块中有超过 \(sz\) 条边,那么该情况无解(抽屉原理);
-
如果该连通块构成了一个首尾相连的环,那么该连通块对答案的贡献为 \(2\)(显然,我们有顺时针和逆时针两种定向方案);
-
在不满足上一点的前提下,如果该连通块构成了一棵环基树,那么该连通块对答案的贡献为 \(1\) (它只能由环向外,不然在链和环合并的节点的入度就不为 \(1\) 了);
-
如果该连通块是一棵树,那么它对答案的贡献是 \(sz\) (以任意一点为根,深度小的节点指向深度大的节点,都是一种方案);
所有连通块的贡献相乘即可。