UOJ Round #26 B. 街头庆典
UOJ Round #26 B. 街头庆典
简短的题目:
给定一棵 个点的无根树,树上每条边都有相同的长度 。
你可以割掉树上的若干条边,割掉第 条边要付出 的代价。
把一些边割掉后,树变成了若干个连通块。你想使得每个连通块的直径长度之和加上割边付出的代价之和最小,输出这个最小值。
搬运题解。
https://zhoukangyang.blog.uoj.ac/blog/8846
有启发性的题。
由直径的性质可知,每个联通块包含了距离其直径的中心不超过某个定值的所有点。
分析最优解下,被割掉的边的端点一定是其所在联通块的直径端点,否则联通块直径长度会变大。
于是考虑在以某个点为根下,除了根节点所在联通块,其他联通块一定以其中深度最浅的点为直径端点。
于是我们考虑以直径的端点为根,这下每个联通块都满足以其中深度最浅的点为直径端点,现在直径是直上直下的了。
设计 dp
, 表示 的边被割掉时 子树内最小代价,设 表示 子树内割掉所有与 距离为 的边的代价之和(注意是边深度小的端点与 的距离,且割掉后剩下联通块的最小代价也得加上,即要与 合并计算)。
直径的中心可能在边的中间,不好记录。
于是记 表示 所在联通块的中心在 子树内,且 到联通块深度最浅点的距离为 ,最小贡献,注意这里 所在的联通块的点可以选取到子树外,因为后面要合并,这样做的好处是可以得知直径的长度和中心,所以 等价于 。且我们要在中心算直径的贡献。
考虑转移:
:
- ,其中 。
- 。
:
- 中心是 :,其中 ,意思是先使这是某一直径,再算贡献,这里距离 为 的祖先即使不存在也不影响,因为我们最终要求的答案是 。
- 中心在 到儿子的边上:
- ,其中 。
- ,此时最浅点为 ,但中心在 中间,所以整个联通块只有 两个点。
- 中心在 的儿子的子树内:
- ,其中 ,因为我们要使这条路径为直径,所以得割掉会影响直径的边,就是子树内距离 恰为某个定值的边。
- 。
反正就是神仙,现在是 的了。
发现 的计算可以长链剖分。
现在处理包括根的长链。
情况一:这条长链上的点所在的所有连通块的中心都在长链上。
这等价于每个连通块都存在直径完全在长链上,因为最优解形态下每个联通块的直径都是直上直下的,而中心在长链上,即直径的底端一定是最深的叶子,也在长链上。
形式地,设 表示长链上 的点构成了一条直径,大概就是 ,其中 表示去除长链影响的贡献。
令 表示长链上第 个点的原 值,大概就是 ,其中 是长链长度,也就是我们这里并不需要 。
将长链从下往上处理,移动 ,更新 ,考虑 的变化。
当 或 时, 就不会再发生变化了( 表示 下挂的短链长度)。
每个 移动时,只会将 挂的短链对应更新,而对后面的影响是一定的且是一段后缀的 的 值,根据长链剖分的性质,这部分修改是均摊 。
影响并不好快速维护,考虑线段树。
现在长剖维护 ,线段树优化计算 。
现在这个假设下可以做到 。
情况二:长链上的点所在的连通块的中心可以在短子树内(或下挂短子树的边中)
(好像情况二是包含情况一的,不管了,下面有用
再考虑上 ,发现由于要考虑直径,所以 的第二维并不能超过子树最大深度,还是考虑长链剖分维护。
但是当中心在长链上时,综合转移需要数组对位取 ,而且位数是整个子树而非短子树的最大深度,所以此时长链剖分无法保证时间复杂度。
而我们只考虑联通块中心在短链的情况下,位数就是短子树的最大深度了,这下可以进行长链剖分。
于是,将情况一和情况二综合,就会考虑到所有转移,就能得到所有 了,但是我们并不能得到 ,原因显然。
但是,这种情况只处理了包括根的长链答案,其他链的情况没有算上。
根据第三种转移,发现合并只需要处理链顶的 值。
我们发现 并不需要考虑 之上的点的形态。
为了方便考虑,我们给将长链从上到下从 开始标号,并将每条长链从深到浅加上 个虚点。
发现, 的含义与 的含义是类似的。
可以发现, 的值也就是直径下端点在长链编号 的点的情况加上中心在短链上的情况。
后者前面算过了,前者在扫描线时多考虑一下就行了。
于是我们可以求出所有的 。
这题就以 的复杂度完成了。
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122252
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步