DestinHistoire

 

BZOJ-1954 Pku3764 The xor-longest Path(trie)

题目描述

  给定一棵 \(n(1\leq n\leq 10^5)\) 个节点的树,树上的每条边都有一个权值。从树中选择两个点 \(x\)\(y\),把从 \(x\)\(y\) 的路径上的所有边权 \(\text{xor}\)(异或)起来,求得到的最大结果。

分析

  设 \(D[x]\) 表示根节点到 \(x\) 的路径上所有边权的 \(\text{xor}\) 值,显然有:

\[D[x]=D[\text{father}(x)]\text{ xor }w\big(x,\text{father(x)}\big) \]

  根据上式,我们可以对树进行一次深度优先遍历,求出所有的 \(D[x]\)。不难发现,树上 \(x\)\(y\) 的路径上所有边权的 \(\text{xor}\) 结果就等于 \(D[x]\text{ xor }D[y]\)。这是因为根据 \(\text{xor}\) 运算的性质(\(a\ \text{xor}\ a=0\)),\(x\) 到根和 \(y\) 到根这两条路径重叠的部分恰好抵消掉。

  所以,问题就变成了从 \(D[1]\) ~ \(D[n]\)\(n\) 个数中选出两个,\(\text{xor}\) 的结果最大,可以用 \(\text{trie}\) 树来快速求解。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int trie[N*30][2],tot=1;
int D[N],head[N],num_edge;
struct Edge
{
    int to;
    int dis;
    int Next;
}edge[N<<1];
void add_edge(int from,int to,int dis)
{
    edge[++num_edge].to=to;
    edge[num_edge].dis=dis;
    edge[num_edge].Next=head[from];
    head[from]=num_edge;
}
void dfs(int x,int fa,int sum)
{
    D[x]=sum;
    for(int i=head[x];i;i=edge[i].Next)
    {
        int y=edge[i].to,z=edge[i].dis;
        if(y!=fa)
            dfs(y,x,sum^z);
    }
}
void insert(int val)
{
    int p=1;
    for(int i=30;i>=0;i--)
    {
        int num=(val>>i)&1;
        if(trie[p][num]==0)
            trie[p][num]=++tot;
        p=trie[p][num];
    }
}
int search(int val)
{
    int p=1;
    long long ans=0;
    for(int i=30;i;i--)
    {
        int num=(val>>i)&1;
        if(trie[p][!num])
        {
            ans=ans+(1<<i);
            p=trie[p][!num];
        }
        else
            p=trie[p][num];
    }
    return ans;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n-1;i++)
    {
        int u,v,w;
        scanf("%d %d %d",&u,&v,&w);
        add_edge(u,v,w);
        add_edge(v,u,w);
    }
    dfs(1,0,0);
    for(int i=1;i<=n;i++)
        insert(D[i]);
    int ans=0;
    for(int i=1;i<=n;i++)
        ans=max(ans,search(D[i]));
    cout<<ans<<endl;
    return 0;
}

posted on 2020-11-23 20:20  DestinHistoire  阅读(39)  评论(0)    收藏  举报

导航