Problem
给一张图,每条边有两个参数:$w,h$,分别代表边长与海拔
有Q个询问,每次询问从给定点出发,借助一辆只能走海拔大于h的边的车后,到一号点最短步行的距离。
Solution
正解是$kruskal$重构树,很好理解,也很好打,网上题解很多,这里就不讲了
下面我们讲一下一个需吸氧且随缘$T$点的做法
可持久化并查集
有没有感觉十分高端大气上档次?
表示没有
之前上网看过这中算法,但是一直没有看懂
问右边大佬这个是怎么实现的
结果
右边大佬:啊?……不就是可持久化那样搞一下……按质合并……就可以了吗?
本$caiji$表示听不懂……
后来跑到隔壁的时候$Na_2S_2O_3\ zbr$提了一嘴
$Na_2S_2O_3$:你别$fake$啰
$caiji$:我是真不会
$zbr$:啊?就是拿个可持久化数组维护一下并查集就可以了啊
$caiji$:可持久化数组是什么?
$Na_2S_2O_3$:就是用主席树维护一个数组啊……
(恍然大雾.jpg)
咳咳,跑题了。
现在来讲一讲这道题
先考虑离线,就是先跑一边最短路
询问与边都按从大到小排序,然后每次询问倒序进去的时候按比海拔高的约束加入能开车的边,
这个东西可以用并查集维护。
每次维护这个联通块中到一号点的最小距离,直接输出就好了。
接下来就是在线了
某位伟大的博士曾说过
勇矢博士:所有可离线做的问题都可以用可持久化数据结构在线做。
好像很有道理……
所以我们这道题可以用可持久化并查集……
对于每个询问,我们只需回到没有添加海拔比$q$小的路的版本,再查询$v$所在的联通块即可
复杂度$O(n(logn)^2)$
卡卡常,好像能过个鬼
拷了个海波的快输还是T了两点
Code
1 |
|