CodeForces 603E Pastoral Oddities

CodeForces 603E Pastoral Oddities

https://codeforces.com/contest/603/problem/E

https://codeforces.com/blog/entry/21885

Snipaste_2020-02-27_15-40-23.png

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))

原文地址:https://www.cnblogs.com/ljzalc1022/p/13191034.html