Caterpillar on a Tree

首先一个很显然的地方就是使用传送门肯定是在叶子节点使用,我们来考虑一下整个过程是怎么样的

为了方便,我们不妨假设可以传送回根节点k+1次,然后要求最后回到根节点

我们先从根节点走到某一个叶子结点,然后再从这个叶子节点走到另一个叶子节点,然后继续走到另一个叶子节点,一直这么下去,最后从某一个叶子结点传送回根节点,然后再重复类似的过程

于是可以知道,我们如果已经知道了叶子节点的访问顺序,我们只需要决定在哪两个叶子节点之间使用传送即可,而且不同相邻叶子节点之间决定是否使用传送是独立的

于是我们尝试写出如果使用传送,代价会减少多少

所以我们对于某一个确定的顺序,对于每个相邻的叶子节点之间,算出dst数组,然后将dst数组从大到小排序,选出前k+1大的即可

所以现在的问题变成,我们如何排序

观察减少的代价,我们很容易想到让dep[u]尽量大,dep[lca]尽量小,于是一个naive的排序方法就出来了:对某个节点,其儿子集合为S,设vSmaxdep[v]表示从v到其叶子节点的最长路,那么对这个节点,将其儿子以maxdep为关键字从大到小进行排序就可以了

这个的严格证明见官方题解

像这种排序的,“梅深不见冬”也是类似题目

posted @   最爱丁珰  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示