我们观察题干知道此题为单调递增(节点),这样我们就不用跑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;
}
标签:rt,ch,XOR,val,int,题解,w1,ans,Path
From: https://www.cnblogs.com/kids1412/p/17997344