CodeForces 603E Pastoral Oddities
Posted ljzalc1022
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 603E Pastoral Oddities相关的知识,希望对你有一定的参考价值。
CodeForces 603E Pastoral Oddities
https://codeforces.com/contest/603/problem/E
https://codeforces.com/blog/entry/21885
Tutorial
Hint
- 存在 sunny paving 的充要条件是什么
- 题目与最小生成树有无关系
我们有 (n) 个点, (m) 条边,称每个点度数为奇数的方案为 sunny paving.
Lemma
一个联通图存在 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的主要内容,如果未能解决你的问题,请参考以下文章
[Codeforces 603E]Pastoral Oddities(LCT)
Codeforces603E - Pastoral Oddities