bzoj 5393 [HAOI2018] 反色游戏

时间:2023-03-10 06:29:12
bzoj 5393 [HAOI2018] 反色游戏

bzoj 5393 [HAOI2018] 反色游戏

Link

Solution

最简单的性质:如果一个连通块黑点个数是奇数个,那么就是零(每次只能改变 \(0/2\) 个黑点)

所以我们只考虑偶数个黑点的连通块

如果是一棵树,那么方案只有一种,因为所有叶子颜色都确定,可以自底向上一层层推出每一条边是否反色

下面考虑一个图,随便找一棵生成树,那么如果其他非树边都不反色就只有一种。假设其它非树边是否反色都已确定,那么相当于这棵生成树的每个点的初始颜色确定,所以每一种非树边的选取方案都对应着一种反色方案,一个 \(n\) 个点 \(m\) 条边的图的方案就是 \(2^{m-n-1}\)

最终的答案就是把所有连通块的方案数乘起来,那么如果有一个连通块黑点个数是奇数个,答案就是零,否则就是 \(2^{m-n-1}\),其中 \(m\) 为总边数,\(n\) 为总点数

下面就简单了,总方案数很好求,删去一个点之后,如果这个点是单独的一个点,那么相当于看奇数个黑点的连通块还有没有,否则如果这个点不是割点,那么对于它所在的连通块的连通性没有影响,所以还是看有没有奇数个黑点的连通块,如果没有直接用总边数减去这个点的度数算一下答案,如果它是割点,那么我们得在预处理的时候处理出来它的所有子树是否存在奇数个黑点的子树,以及它所在连通块去掉它及它的子树之后有没有奇数个黑点的连通块,没有还是按照之前的方法算一下答案

更详细的解答地址 Link

Review

思路比较清奇,但是不难想

关键是实现部分,如果不仔细考虑实现方式会写的丑陋而且长(这就是我不贴自己代码的原因),但是像 \(\text{dy0607}\) 这样实现就非常简单而且不易错