[NOI2018] 归程

传送门

题目大意

给定一张无向图,每条边有一个海拔 a a a,每次询问一个 v v v p p p 表示起点和水位。可以从起点开始先花费 0 0 0 到达任意点,条件是不经过 a ≤ p a\le p ap 的边。如果必须要经过这样的边,那么在进入这条边的端点开始,经过每条边的花费就是其长度。求 v → 1 v\to 1 v1 的最小花费是多少。

Solution

题意非常神必,还强制在线。

不过有一个很直观的想法就是做最大生成树。现在我介绍一下最大生成树的思路:

首先跑最大生成树,然后以每次询问可以分成两种情况:

  • 水位没有超过 v → 1 v\to 1 v1 路径上的最小值,那么可以直接到达,输出 0 即可;
  • 水位超过了 v → 1 v\to 1 v1 路径上的最小值,此时我们需要知道一个点 u u u,表示从 v v v 1 1 1 路径上最后一个可以 0 0 0 费到达的点,也就是说 e d g e : u → f a u edge:u\to fa_u edge:ufau 这条边的 a a a 是前面所有经过的边中第一个小于等于 p p p 的。那换句话说,我们可以 0 0 0 费到达 u u u 的子树中的任意一点。那很显然答案就是所有在 u u u 的子树中的点到 1 1 1 的最短路的最小值。

现在我们考虑解决上面提到的若干需求。

求路径最小值

这个很简单,做一下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值