CF603E Pastoral Oddities

题目条件的充要条件是原图每个连通块点数都是偶数。

  • 必要性:若为奇数,则总度数为奇数*奇数,还是奇数,但是每条边贡献两个度,总度数一定是偶数。矛盾。

  • 充分性:对于一个偶数个点的连通块,我们一定能找到合法的边集,构造方式如下:

随便抠出一颗生成树,随便定个根,从叶子开始向上重复这个流程:若该点的儿子连向它的边数为偶数,则连上这个点到父亲的边。

易得这样可满足除了根以外所有点度为奇数,而总度数是必然偶数,因此根节点的度也是奇数。


最大边最小的限制看着就很像类似最小瓶颈树的东西。于是我们就得到了静态做法:从小到大不断加边,并查集维护奇连通块数目,直到所有连通块大小都是偶数为止。此时加入的最大边就是答案。

但是这题是动态的!

观察到答案单调不增。

我们发现每条边从加入到边权大于答案(永远不可能再成为答案)的时间是一段区间,即每条边有一个影响区间。这引诱提示我们进行线段树分治。

将时间轴 reverse ,从后往前做,那么此时答案单调不降。

将边按边权排序并从小到大加边,一旦满足条件后停止。易得中间加新入的每一条边(包括加入失败和加入成功的)都有可能在后面(注意事项时间轴 reverse后的向后)成为答案边集中的一部分。

那么这些边的影响范围就是 [当前时间点,这条边加入的时间],这就可以线段树分治了。

一个实现上的小细节是将一条边的影响范围拍到线段树上的时候区间应该是 [当前时间点1,这条边加入的时间],这样才能保证正确性。要不然会少加一车边。不过我不会证

posted @   jimmyywang  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示