倍增,树剖都可以解决这里不再展开。
-## kruscal 重构树
+## kruskal 重构树
### 定义
-在跑 kruscal 的过程中我们会从小到大加入若干条边。现在我们仍然按照这个顺序。
+在跑 kruskal 的过程中我们会从小到大加入若干条边。现在我们仍然按照这个顺序。
首先新建 n 个集合,每个集合恰有一个节点,点权为 $0$ 。
![](./images/mst5.png)
-这张图的 kruscal 重构树如下:
+这张图的 kruskal 重构树如下:
![](./images/mst6.png)
### 性质
-不难发现,最小生成树上两个点之间的简单路径上边权最大值 = kruscal 重构树上两点之间的 LCA 的权值。
+不难发现,最小生成树上两个点之间的简单路径上边权最大值 = kruskal 重构树上两点之间的 LCA 的权值。
-也就是说,到点 $x$ 的简单路径上边权最大值 $\leq val$ 的所有点 $y$ 均在 kruscal 重构树上的某一棵子树内,且恰好为该子树的所有叶子节点。
+也就是说,到点 $x$ 的简单路径上边权最大值 $\leq val$ 的所有点 $y$ 均在 kruskal 重构树上的某一棵子树内,且恰好为该子树的所有叶子节点。
-我们在 kruscal 重构树上找到 $x$ 到根的路径上权值 $\leq val$ 的最浅的节点。显然这就是所有满足条件的节点所在的子树的根节点。
+我们在 kruskal 重构树上找到 $x$ 到根的路径上权值 $\leq val$ 的最浅的节点。显然这就是所有满足条件的节点所在的子树的根节点。
!!! note "[NOI 2018 归程](https://www.luogu.org/problem/P4768)"
首先预处理出来每一个点到根节点的最短路。
我们构造出来根据海拔的最大生成树。显然每次询问可以到达的节点是在最小生成树和询问点的最小边权 $\geq p$ 的节点。
- 根据 kruscal 重构树的性质,这些节点满足均在一颗子树内同时为其所有叶子节点。
+ 根据 kruskal 重构树的性质,这些节点满足均在一颗子树内同时为其所有叶子节点。
- 也就是说,我们只需要求出 kruscal 重构树上每一棵子树叶子的权值 min 就可以支持子树询问。
+ 也就是说,我们只需要求出 kruskal 重构树上每一棵子树叶子的权值 min 就可以支持子树询问。
- 询问的根节点可以使用 kruscal 重构树上倍增的方式求出。
+ 询问的根节点可以使用 kruskal 重构树上倍增的方式求出。
时间复杂度 $O((n+m+Q) \log n)$