题目描述

输入描述:

输出描述:

示例1
输入
3
1 2
3
1 1
输出
3
2
说明

备注:

题目大意
……备注里的话有点……。给定一棵树,树上有一些关键点 ( k e y ) (key) (key)。要求对于 k ∈ { 1 , 2 , . . . , n } k \in\{1,2,...,n\} k∈{
1,2,...,n}个关键点,求所有节点的 A n c i e n t D i s t a n c e Ancient \,\,\,Distance AncientDistance的最大值最小是多少。其中, A n c i e n t D i s t a n c e Ancient \,\,\,Distance AncientDistance是这个节点在到根节点 r o o t root root的路径上第一个 k e y key key的距离。
备注:如果你有了结果,勇敢地尝试吧
分析
看到题目中说,求最大值的最小,第一个想法就是二分答案。虽然 d a l a o dalao dalao用分块,但是蒟蒻还是用二分。二分 k k k个节点的最大值,然后验证答案即可。
那么问题来了,怎么验证答案呢???
一下我们分几个问题进行分析:
dfs序
首先,我们对这棵树进行dfs序的标号(不计回溯):

对此,可以跑一次 d f s dfs dfs,记下 d f n dfn dfn。然后,我们发现可以对这棵树进行操作——展开变成线段。

此时,如果我们需要对 2 2 2的子树操作,就是对区间 2...6 2...6 2...6进行操作。
线段树
此时,已经展开的树就可以用线段树进行修改和查询了。
但是开头的问题是,怎么验证?我们可以考虑求出每个节点的深度,然后从最深的节点开始,向上 k k k层,就能使得 A n c i e n t D i s t a n c e Ancient \,\,\,Distance AncientDistance最大为 k k k。此时,我们将向上 k k k层的节点设为 k e y key key,则整棵子树都有了 A n c i e n t D i s t a n c e Ancient \,\,\,Distance AncientDistance,以上图 k = 2 k=2

本文详细介绍了Ancient Distance问题的解决方案,通过二分查找、 dfs序、线段树以及倍增算法来求解最大值最小的情况。文章讲解了如何使用dfs序将树展开为线段,并借助线段树进行修改和查询,同时结合倍增算法快速跳跃节点,最终达到验证和优化解法的目的,总复杂度为O(nlog^3n)。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



