Description
题目链接:POJ 3764
给定一棵有 $n$ 个节点的树,每条边有一个权值 $a_i$。你需要在树上找一条简单路径,使得这条路径上的边权异或和最大。
数据范围:$1\le n\le 10^5$,$0\le a_i<2^{31}$
Solution
首先我们对这个问题进行转化:设 $f(u,v)$ 表示从 $u$ 到 $v$ 的简单路径上的边权异或和。那么根据异或的性质,有 $f(u,v)=f(1,u)\oplus f(1,v)$,故问题转化为 $\max_{1\le i\le n,1\le j\le n}f(1,i)\oplus f(1,j)$,可以 $O(n^2)$ 解决,但是无法通过此题。
接下来考虑如何优化。这个式子的本质其实是:对于每一个 $f(1,i)$,找到一个 $f(1,j)$ 使得 $f(1,u)\oplus f(1,v)$ 最大。我们可以非常套路地贪心,使得答案的高位尽量为 $1$。对于每个点求出它到根的路径的异或和 $dis_i$ 并插入 $\text{Trie}$ 树,再对于每个 $dis_i$ 在 $\text{Trie}$ 树上找贪心地找到对应的 $dis_j$。
贪心策略:尽量在 $\text{Trie}$ 树上走和当前位不同的节点;如果没有,则只能妥协走当前节点仅有的儿子。
时间复杂度:$O(n\log a_i)$
Code
1 |
|