ABC348
1|0E - Minimize Sum of Distances
https://atcoder.jp/contests/abc348/tasks/abc348_e
换根DP or 带权树的重心
换根DP
如果只求根节点的
但是要求出所有节点的
- 考虑对
的子节点 (这里 是 的左子树)换根:- 显然对于
及其子树,所有度数都少 ,再各自乘以 后也就是减去一倍的 - 然后要加上
及其右子树,所有度数都多一,再各自乘以 后也就是加上一倍的 ,即除了 的子树之外的所有子树的 .
- 显然对于
树的重心
-
定义
-
如果在树中选择某个节点并删除,这棵树将分为若干棵子树,统计子树节点数并记录最大值。取遍树上所有节点,使此最大值取到最小的节点被称为整个树的重心。
-
(这里以及下文中的「子树」若无特殊说明都是指无根树的子树,即包括「向上」的那棵子树,并且不包括整棵树自身。)
-
-
性质
-
树的重心如果不唯一,则至多有两个,且这两个重心相邻。
-
以树的重心为根时,所有子树的大小都不超过整棵树大小的一半。
-
树中所有点到某个点的距离和中,到重心的距离和是最小的;如果有两个重心,那么到它们的距离和一样。
-
把两棵树通过一条边相连得到一棵新的树,那么新的树的重心在连接原来两棵树的重心的路径上。
-
在一棵树上添加或删除一个叶子,那么它的重心最多只移动一条边的距离。
-
-
求法
- 在 DFS 中计算每个子树的大小,记录「向下」的子树的最大大小,利用总点数 - 当前子树(这里的子树指有根树的子树)的大小得到「向上」的子树的大小,然后就可以依据定义找到重心了。
那么这题如果
- 我们由树的重心的定义:以树的重心为根时,所有子树的大小都不超过整棵树大小的一半。
- 感性推导一下:带权树的重心,就是所有子树的大小都不超过
然后用求重心的思路求就可以了。
2|0F - Oddly Similar
https://atcoder.jp/contests/abc348/tasks/abc348_f
bitset 卡常题
显然的最暴力的写法,复杂度为
就差一点能过。
不久前用到的一个思路,先改变枚举的顺序:
第一重枚举还是枚举行
先写出这个思路:
仍然跑了一样的复杂度。
但是我们发现 std::bitset
代替,这样就有优化了
时间复杂度大概是
__EOF__

本文链接:https://www.cnblogs.com/kdlyh/p/18262355.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示