题目大意
给定一张无向图,每条边有一个海拔 a a a,每次询问一个 v v v 和 p p p 表示起点和水位。可以从起点开始先花费 0 0 0 到达任意点,条件是不经过 a ≤ p a\le p a≤p 的边。如果必须要经过这样的边,那么在进入这条边的端点开始,经过每条边的花费就是其长度。求 v → 1 v\to 1 v→1 的最小花费是多少。
Solution
题意非常神必,还强制在线。
不过有一个很直观的想法就是做最大生成树。现在我介绍一下最大生成树的思路:
首先跑最大生成树,然后以每次询问可以分成两种情况:
- 水位没有超过 v → 1 v\to 1 v→1 路径上的最小值,那么可以直接到达,输出
0
即可; - 水位超过了 v → 1 v\to 1 v→1 路径上的最小值,此时我们需要知道一个点 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:u→fau 这条边的 a a a 是前面所有经过的边中第一个小于等于 p p p 的。那换句话说,我们可以 0 0 0 费到达 u u u 的子树中的任意一点。那很显然答案就是所有在 u u u 的子树中的点到 1 1 1 的最短路的最小值。
现在我们考虑解决上面提到的若干需求。
求路径最小值
这个很简单,做一下