给定一颗无根树 \(|T|\)。
求两条点不相交的路径,使得两条路径上边权的异或和加起来最大。
这是一个经典 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\) 为根考虑深度,假如我们把 \([1\rightarrow x]\cup[1\rightarrow y]\) 这条路径扣掉,整棵树会被分为若干个连通块。
这样,我们只需要考虑每个连通块的根。这意味着每个点只会被考虑到一次。
时间复杂度 \(\mathcal O(n\log n)\)。
