2020牛客暑期多校训练营Ancient Distance(二分+贪心+dfs序+线段树)

Ancient Distance

题目描述

在这里插入图片描述

输入描述:

在这里插入图片描述

输出描述:

在这里插入图片描述

示例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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值