P6072 『MdOI R1』Path

给定一颗无根树 \(|T|\)

求两条点不相交的路径,使得两条路径上边权的异或和加起来最大。

\[|T| \le 3\times 10^4 \]


这是一个经典 trick:

对于求两条点不相交路径,我们可以枚举点 \(x\),使得其中一条在 \(x\) 的子树内,另外一条在 \(x\) 的子树外。不难发现这样覆盖了所有的情况。


不妨以 \(1\) 为根。

那么对于这题,路径上的异或和等于前缀和的异或,那么相当于子树 内/外 选两个点异或最大。

对于子树内的情况,可以简单 01trie 启发式合并解决。复杂度 \(\mathcal O(n\log^2 n)\)

对于子树外的情况,我们先求出整个树上异或和最大的路径 \([x\rightarrow y]\)

那么很明显不在 \([1\rightarrow x]\cup[1\rightarrow y]\) 这个路径上的点的答案就是这条路径。

对于一个点,答案是整个树扣掉 dfn 上他的区间。

那么对于一条路径 \([1\rightarrow x]\) 上的每一个点,按深度从大往小考虑,他们的贡献区间单调包含,那么可以直接维护,复杂度 \(\mathcal O(n\log n)\)

总体复杂度 \(O(n\log^2 n)\)


还有更好的办法。

我们考虑假如子树外的答案相同,那么我们只需要最大化子树内的答案。

假如我们只考虑子树内的答案,那么显然一个点的祖先不会比他更劣。

假如我们把 \([1\rightarrow x]\cup[1\rightarrow y]\) 这条路径扣掉,整棵树会被分为若干个连通块。

这样,我们只需要考虑每个连通块的根。这意味着每个点只会被插入到 01trie 一次。

时间复杂度 \(\mathcal O(n\log n)\)

posted @ 2025-10-24 20:59  CuteNess  阅读(7)  评论(0)    收藏  举报