[CF888G] Xor-MST

考虑 Kruskal 算法的过程,每次找到权值最小的两端点不连通的边并加入生成森林。

而我们面对的是一张完全图,所以考虑将所有点权放到 01-Trie 上,如果有两对点 LCA 深度不同,那么 LCA 较深的点对之间的边的权值一定较小。也就是说,Kruskal 过程中,所有边一定是按照两端点在 01-Trie 上对应的节点的 LCA 由深到浅被考虑的。

那么着眼于同一层之内,我们要对于这一层中的每个点 $u$,在以它的两个儿子为根的子树内,分别找到一个节点,使他们异或的结果最小。并且对于不同的 $u$,我们的选择之间是独立的。

那么我们遍历这颗 01-Trie,对于每个左右儿子都有的节点,枚举左儿子,在右儿子中查询与它异或后的最小值。这样一个叶子节点最多被 $O(\log v)$ 个父亲查询,每次查询 $O(\log v)$,总时间复杂度为 $O(n\log^2v)$。

作者

nalemy

发布于

2023-11-13

更新于

2024-03-25

许可协议