P5811 [IOI2019] 景点划分

不妨设 abc,则此时让集合 A,B 联通的限制一定是最松的。于是我们的任务就是找出两个大小分别为 a,b 的连通块。

  • 需要知道的一点:假设我们找到了一个大于目标大小的连通块,构造时只需要一个一个地把叶子剥掉直至大小合法就行了。

先考虑原图是树的情况。由于 bc,故满足 bn2。也就是说,我们要找到最大的一条边,使得它两侧的点尽量均匀分布。考虑把重心提为根,对于所有重心的所有子树中大小最大的一颗,判断它的大小是否 a,假若是,必定有解;否则无解。

  • 证明。

    有解:大小大于 a 的一颗子树可以通过剥叶子得到大小得到 A。根据树的重心性质其余部分大小 n2,而 bn2,必定也可以通过剥叶子得到 B

    无解:考虑一颗子树还没法得到 a,要让连通块扩大,就必须包含重心,那其余的所有子树就不连通了。而 B 又不可能只在一颗子树中取,所以无解。

接下来回归一般图的情况。我们任取一颗 DFS 树(此时重心不一定为根结点),继续考虑重心 u 的子树。我们钦定 u 上方的子树为 Tu 下方的子树为 S1,S2,S3,...,Sl,假若 max(|S1|,|S2|,|S3|,...,|Sl|)a,则按照前面所述的剥叶子方法求解(|S| 表示子树 S 的结点个数)。

对于剩下的情况,继续判断:如果 Si 中与 T 中有连边的子树与 T 的大小和 <a,则必定无解。

否则,只需要逐个往 A 中加入和 T 相连的连通块,直到大小 a。因为所有 Si 都小于 a,所以剩下的连通块大小一定 n2ab,从中剥叶子选出 B 集合即可。

  • 对于“ Si 中与 T 中有连边的子树与 T 的大小和 <a”必定无解的证明:为什么大小和 <a 无解。考虑 T 以及与它有连边的所有 Si,它们靠剥叶子得到 A 显然都不可能,故而必须要包含重心;而这样一来,剩余的 Sj 就不连通了,再加上所有 |Sj|<a,故而不合法。
  • 为什么 n2ab。根据题目条件,nac=b,而 a<c,故而成立。
posted @   徐子洋  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示