P16705 传送

P16705 传送

题意:

给定一棵树,其中点 \(x\) 能走到 \(y\) 当且仅当 \(x\) 和 \(y\) 存在祖先关系,代价为 \(t\) 。

\(q\) 次询问求 \(u,v\) 两点间经过的最小代价。

解法:

那么可以把图上的边都建出来,这样有 \(O(n^2)\) 条。

那么这看着就是一个 \(kruskal\) 生成树的题,唯一问题是边太多。

考虑删掉一些无用的边。

考虑三个节点 \(x,y,z\) ,代价分别记为 \(w_{x-y},w_{y-z},w_{x-z}\) 。

如果 \(w_{x-y}\) 的最高位等于 \(w_{x-z}\) 的最高位,那么就一定会有 \(w_{y-z}<\min(w_{x-y},w_{x-z})\) ,那么可以删掉 \(\max(w_{x-y},w_{x-z})\) 。

这样的好处就是一个点往外连的边最多 \(\log V\) 条, 总边数 \(n\log V\) 条,那直接 \(kruskal\) 生成树就好了。

具体是怎么去连边。

用 \(Trie\) 即可,按照高到低位建出 \(Trie\) 树 。可能需要撤销操作。

如图,红色部分最多 \(\log V\) 个点,每个红色部分的点最多会查 \(\log V\) 次(即绿色部分)。

这部分时间复杂度 \(O(n\log^2V)\) 。

为什么我没做出来?

我太习惯于将树上问题独立思考性质,或认为树是图的简化,而对于这种需要将视角放的更宏观(看成是一个图)的问题,完全不知道如何下手,或者说完全没有从这方面进行考虑。

这道题思维难度其实不高,关键是要从图的角度( \(kruskal\) 生成树 )来思考整个题。

posted @ 2026-10-12 15:05  wlhao  阅读(7)  评论(0)    收藏  举报