HDU.4757.Tree(可持久化Trie)
题目链接 \(Description\) 给定一棵树,点有点权。 \(Q\) 次询问 \(x,y,z\) ,求 \(x\) 到 \(y\) 的简单路径中,与 \(z\) 异或能得到的最大的数是多少。 \(Solution\) 对于给定数集的询问,我们可以建Trie树,从高位到低位贪心地走(能走优的就走)。 同树上的主席树一样,利用父节点的根节点建树,就是可持久化Trie。 令 \(w=LCA(u,v)\) 。因为只是xor一个数,所以用 \(u,v,w\) 三个点的根节点就可以了,最后再判断一下 \(w\) 是否可能更优(不需要 \(fa[w]\) )。 在 \(u,v,w\) 三棵Trie上走,若 \(sz[u]+sz[v]-2*sz[w]>0\) 则能走。 区间询问同理也可以做。 //1201MS 30704K #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> #define gc() getchar() #define BIT 15 const int N=1e5+5; int Enum,H[N],nxt[N<<1],to[N<<1],A[N],root[N],fa[N],dep[N],sz[N],son[N],top[N]; struct Trie { #define S