码迷,mamicode.com
首页 > 其他好文 > 详细

CodeForces 603E Pastoral Oddities

时间:2020-06-25 09:56:23      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:注意   load   检查   联通   不可   force   开始   除了   关心   

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

标签:注意   load   检查   联通   不可   force   开始   除了   关心   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!