P5811 题解

problem & blog

题解代码都长得离谱,2k 代码了解一下!

如果我码风比较压行还可以 2k 以内,但是很不幸我是空格 + 大括号换行流


不妨设 abc,如果能使 C 联通,那么从中取出一个 AB 的连通块也是平凡的,所以只考虑 A,B

考虑树的情况。要找到一条边 (u,v) 满足 u 那边的子树的 sizav 那边的子树的 sizb

容易发现 abn2,联想到重心,它的性质是 sizn2,所以只需要枚举与重心相连的边,如果能找到一个子树把 A 塞进去,那么 nsiz>nn2>n2,很容易就能把 B 塞进去。找不到就是无解。

回到简单图。上面的 Special Task 提示我们建 DFS 树,并找到它的重心。下文令 sizi 表示重心相邻的那些点的子树。

如果 sizia,直接按照树的方法构造即可。否则,考虑第一个子树,有一些其他的子树会与它相连。如果这些相连的子树都算上了,还是没法干掉 A,那么必须动用两次重心了,无解。

S 表示干掉 A 需要用到的点集。可以认为这个过程是一个一个看子树,当 Ssizi 成功干掉 A,立刻终止。由于 sizi<a,故 Ssizi<2a。继续化简,n=a+b+c>2a+b>Ssizi+b,所以 b<nSsizi,也就是说必定可以干掉 B

输出即可。注意调换了 a,b,c 满足 abc 后,输出也要调整一下。

代码,时间复杂度 O(n+m)

posted @   liangbowen  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示