标签:注意 load 检查 联通 不可 force 开始 除了 关心
https://codeforces.com/contest/603/problem/E
https://codeforces.com/blog/entry/21885
我们有 \(n\) 个点, \(m\) 条边,称每个点度数为奇数的方案为 sunny paving.
一个联通图存在 sunny paving 当且仅当节点数为偶数
首先证明所有点数为偶数的图都存在sunny paving.
我们随意找这个联通图的一个生成树,从叶子开始贪心的构造,然后除了根以外所有点相邻的 paved 边都是奇数. 考虑只有 paved 边的图,由于总度数为偶数,所以根相邻的paved边个数也是奇数.
然后证明所有点数为奇数的图都不存在sunny paving
假设存在sunny paving,那么所有点度数的和就是奇数,这是不可能的.
现在我们只关心每个联通块大小的奇偶性.
加入我们只计算一次,我们可以用kruskal算法,直到每个联通块点数为偶数时停下.如果不存在则无解,复杂度 \(O(m \log n)\)
为了加速,我们维护kruskal算法的结束为止.用LCT来维护.
首先类比我们如何在线的维护最小生成树的,如果 \(u,v\) 不联通,则加入.否则,查询 \(u,v\) 间的最长边,如果它的长度更大,则将它删除,并加入 \(u,v\) .
会到原本的问题,注意我们的状态相当于用kruskal找最小生成树检查了 \(k\) 条边后的状态(我们也不再关心 \(k\) 条边之后的边).所以当我们向森林里添加一条边时,我们可以用维护最小生成树的方法,得到检查之前的 \(k\) 条边与新加入的这条边之后的最小生成树.
那么我们可以一次检查着 \(k+1\) 条边的最长边是否有必要,即删掉这条边后是否分出了点数为奇数的联通块.然后我们就可以得到第一次所有联通块为偶数的时间.这样每条边的均摊复杂度是 \(O(\log n)\) 的,总的复杂度为 \(O(m \log n)\)
CodeForces 603E Pastoral Oddities
标签:注意 load 检查 联通 不可 force 开始 除了 关心
原文地址:https://www.cnblogs.com/ljzalc1022/p/13191034.html