求助 卡常
查看原帖
求助 卡常
793095
ZR_BL楼主2024/10/30 21:56
#include<bits/stdc++.h>
#define end ed
using namespace std;
const int M=1e6+5;
int n,m,op,x,y,z,t;
int dis[M],a[M];
int ed;
int l,r,lca,ans;
int fa[M],son[M];
int h[M],cnt;
struct edge{int h,t,x,nxt;}e[M<<1];
void add(int x,int y,int z){e[++cnt]={x,y,z,h[x]};h[x]=cnt;}
int tr[M<<6][2],num,v[M<<6];
void insert(int x,int id,int p=0){
    for(int i=30;i>=0;i--){
        int y=(x>>(i-1))&1;
        if(!tr[p][y])tr[p][y]=++num;
        p=tr[p][y];
    }
    v[p]=id;
}
void clear(int p=0){
    if(tr[p][0])clear(tr[p][0]),tr[p][0]=0,v[p]=0;
    if(tr[p][1])clear(tr[p][1]),tr[p][1]=0,v[p]=0;
}
void get(int x,int id,int p=0){
    int sum=0;
    for(int i=30;i>=0;i--){
        int y=(x>>(i-1))&1;
        if(tr[p][y^1])sum+=(1<<(i-1)),p=tr[p][y^1];
        else p=tr[p][y];
    }
    if(sum>=ans)ans=sum,l=id,r=v[p];
}
void MAX(int x,int fx){
    insert(dis[x],x);
    get(dis[x],x);
    for(int i=h[x];i;i=e[i].nxt){
        int y=e[i].t;
        if(y==fx)continue;
        MAX(y,x);
    }
}
int read(){
    int ans=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){ans=(ans<<3)+(ans<<1)+(ch^48);ch=getchar();}
    return ans*w;
}
void dfs(int x,int fx,int sum){
    dis[x]=sum;
    for(int i=h[x];i;i=e[i].nxt){
        int y=e[i].t;
        if(y==fx)continue;
        dfs(y,x,sum^e[i].x);
    }
}
void DFS(int x,int fx){
    fa[x]=fx;
    for(int i=h[x];i;i=e[i].nxt){
        int y=e[i].t;
        if(y==fx)continue;
        DFS(y,x);
    }
}
void write(int x){
    if(x>=10)write(x/10);
    putchar(x%10+48);
}
void sol(int x,int y){
    int lx=l,rx=r;
son[y]=0,fa[x]=0;
    while(y!=x){
        son[fa[y]]=y;
        y=fa[y];
    }
    while(y){
        for(int i=h[y];i;i=e[i].nxt){
            int z=e[i].t;
            if(z==fa[y]||z==son[y])continue;
            clear();
            num=0;
            ans=0;
            MAX(z,y);
            end=max(end,ans+op);
        }
        y=son[y];
    }
    clear(),ans=0,num=0;
    y=rx;
    MAX(y,fa[y]);
    a[y]=ans,y=fa[y];
    while(y!=lx){
        insert(dis[y],y);
        for(int i=h[y];i;i=e[i].nxt){
            int z=e[i].t;
            if(z==fa[y]||z==son[y])continue;
            MAX(z,y);
        }
        get(dis[y],y);
        a[y]=ans;
        y=fa[y];
    }
    clear(),num=0,ans=0;
    y=son[lx];
    MAX(lx,son[lx]);
    while(y){
        end=max(end,a[y]+ans);
        for(int i=h[y];i;i=e[i].nxt){
            int z=e[i].t;
            if(z==fa[y]||z==son[y])continue;
            MAX(z,y);
        }
        insert(dis[y],y);
        get(dis[y],y);
        y=son[y];
    }
}
signed main(){
        n=read();
        clear();cnt=0;end=0;num=0;
        for(int i=1;i<=n;i++)h[i]=0;
        for(int i=1;i<n;i++){
            x=read(),y=read(),z=read();
            add(x,y,z),add(y,x,z);
        }
        dfs(1,0,0);
        ans=l=r=0;
        MAX(1,0);
        op=ans;
        DFS(l,0);
        sol(l,r);
        write(end);
        putchar('\n');
    return 0;
}
2024/10/30 21:56
加载中...