The XOR-longest Path 题解

我们观察题干知道此题为单调递增(节点),这样我们就不用跑dfs了

很显然的一件事是两点间的权值只与子节点有关

所以我们用w1[v]=w1[u]*w就能更新v到根节点的权值

然后我们循环放入字典树,再取最大的(由于这题数据特别水,所以没算v-u的w1)

#include<bits/stdc++.h>
using namespace std;
int ch[9999999][2],maxsiz(1<<30),cnt,n,maxx,w1[100001],u,v,w;;
inline long long read()
{
    register int x=0;register bool f=1;
    register char c=getchar();
    for(;c<'0'||c>'9';c=getchar())if(c=='-')f=0;
    for(;'0'<=c&&c<='9';c=getchar()) x=(x<<3)+(x<<1)+(c^48);
    return f?x:~x+1;
}
inline void add(int val)
{
    int rt(0);
    for(int i(maxsiz);i;i>>=1)
    {
        bool x=(val&i);//查看该位是几
        if(!ch[rt][x])ch[rt][x]=++cnt;
        rt=ch[rt][x];
    }
}
inline int query(int val)
{
    int ans(0),rt(0);
    for(int i(maxsiz);i;i>>=1)
    {
        bool x(val&i);//查看该位是几
        if(ch[rt][x^1])ans=ans<<1|1,rt=ch[rt][x^1];
        else ans<<=1,rt=ch[rt][x];
    }
    return ans;
}
int main()
{
    n=read();
    for(int i=1;i<n;++i)
    {
        u=read(),v=read(),w=read();
        w1[v]=w1[u]^w;
    }
    for(int i=1;i<=n;++i)
    {
        add(w1[i]);
        maxx=max(maxx,query(w1[i]));
    }
    cout<<maxx;
}
posted @ 2024-01-30 16:09  HZOI_Night_Voyager  阅读(30)  评论(0)    收藏  举报