cf 980 div 1 C. C+K+S

首先,最开始给的图是合法的。

其次,由 tarjan 强连通算法的引理,我们知道,若这张图强连通,这张图的所有点就一定构成一个环。

也就是说针对原图染色对于所有 \((u,v)\) 边,都有 \(c_{u} \equiv c_{v}+1\pmod k\) 成立。

针对第一个点的染色,每个图,我们有 \(k\) 中不同的染色方案。

当我们想在图上连上一条边的时候,就需要让连上的边也满足这个性质。

我们可以证明当存在解时,一定有一种给原图染色的方法,使得添加的每条边都有这个性质。

于是,我们哈希的判断不同的染色方案时,是不是针对每一个图 1 中颜色为 \(c\) 的出点,都有图 2 中颜色为 \((c+1) \bmod k\) 的入点与之对应,以及是不是针对每一个图 2 中颜色为 \(c\) 的出点,都有图 1 中颜色为 \((c+1) \bmod k\) 的入点与之对应。也就是判断是否存在一种染色方案,使得图 1 中颜色为 \(c\) 的出点的数量和图 2 中颜色为 \((c+1) \bmod k\) 的入点的数量一样(以下称“条件 1”)以及图 2 中颜色为 \(c\) 的出点的数量和图 1 中颜色为 \((c+1) \bmod k\) 的入点的数量一样(以下称“条件 2”)这两个条件成立。

这样,我们考虑,对于原图 \((c_{i}+1) \bmod k\),这样可以构造一组全新的染色方案,并且这样其实相当于把原来的染色方案向右循环移位一位。

因此,对于一种染色方案,我们可以把每个图中的所有点按照 \(c_{i}\) 从小到大排序,我们把图 2 的点向左循环移位一遍,如果在每个位置上,图 1 图 2 的类型都不一样,我们就认为条件 1 成立。同时,我们根据同样的套路检查条件 2 是否合法。这里如果我们把每个图中点的类型反过来,就只需要检查两个序列是否一样即可(方法 1)。

这时候,时间复杂度是 \(O(n^3)\) 枚举两个图的染色方案,然后再验证。我们发现两边同时移位是无意义的,于是只枚举一个图的方案,时间复杂度来到了 \(O(n^2)\),接下来,考虑我们我们需要比较两个图的相等关系(方法 1),以及循环移位,所以考虑哈希字符串,我们就可以做到 \(O(1)\) 检查,\(O(n)\) 枚举。

这样,我们就解决了这题!

posted @ 2025-03-05 15:17  PM_pro  阅读(22)  评论(0)    收藏  举报