题目大意
给定一个$n$个节点和$m$条边($u,v,w$)的图,有$q$次询问($x,k$)($1 \le n,m,q \le 10^5$),
每次询问为以下含义:
你最开始在$x$节点,有$k$点能力值,每次第一次到一个节点$i$,就能获得$a[i]$点能力值(最开始当然也会获得$x$节点的能力值)
而通过每一条边需要有最少有$w_i$的能力值,通过边不会减少能力值,
可以多次经过同一个点和边,求 你最后的能力值最多为多少。
原题地址
思路
主要思想还是 $Kruskal$重构树,不了解的可以去了解一下,或者看看我写的简要版本,我写的比较简略,完全没有学过的可以去看看别的博客,比如这个。
为什么会想到$Kruskal$重构树呢?
- 我们最好情况一定是遍历完所有的点,那么最优路线一定是最小生成树
- 我们能否继续到达某个点很大一部分是根据最小生成树路径上权值最大的边
那么看起来就可以用$Kruskal$重构树解决,所以我们不妨来试一试 (其实蒟蒻根本想不到别的方法了QAQ)
观察一波$Kruskal$重构树的性质:
- 边权越大的形成的点都越靠上
- 当你到达了一个非叶子节点,就意味着你一定可以到达这个点子树上的所有叶子节点
那么我们发现,使用$Kruskal$重构树确实是可以解决的
我们使用倍增的方法,依次往上找。
$sum[x]$记录的是在子树$x$上能获得的能力值
$maxNum[x][i]$记录的是从$x$到它的$i$级祖先中,最大的边权比能够获得的能力值大多少
代码
1 |
|
- 本文作者: 水蓝络合物
- 本文链接: https://miku39393939.github.io/2021/12/06/Life-is-a-Game/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!