题目链接:点击查看
题目大意:有 n 座山峰,每座山峰有他的高度 h[ i ] ,有些山峰之间有双向道路相连,共 m 条路径,每条路径有一个困难值,这个值越大表示越难走。
现在有 q 组询问,每组询问询问从点 v 开始只经过困难值小于等于 x 的路径所能到达的山峰中第 k 高的山峰,如果无解输出 −1。
题目分析:因为有困难值的限制,所以可以对整个图跑克鲁斯卡尔重构树,如果对点 v 来说,只能走小于等于 x 的路径,可以树上倍增找到权值小于等于 x 的,深度最浅的祖先,显然这个祖先子树中的所有点都是可以从点 v 到达的,接下来找第 k 小,就是主席树的工作了,dfs 序上建一下主席树就好了
注意,题目中需要求的是第 k 大,而不是第 k 小
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include