题目链接:Xor Path
显然对于一个点,如果有偶数条路径通过这个点,那么贡献为0。
所以统计每个点有多少条路径通过这个点即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=5e5+10;
int n,res,w[N],sz[N];
vector<int> g[N];
inline void add(int a,int b){g[a].push_back(b),g[b].push_back(a);}
void dfs(int x,int fa){
sz[x]=1; long long cnt=n-1,sum=0;
for(auto to:g[x]){
if(to==fa) continue; dfs(to,x); sz[x]+=sz[to];
cnt+=sum*sz[to]; sum+=sz[to];
}
if(x!=1) cnt+=1LL*(sz[x]-1)*(n-sz[x]);
if(cnt&1LL) res^=w[x];
}
signed main(){
cin>>n;
for(int i=1,a,b;i<n;i++) scanf("%d %d",&a,&b),add(a,b);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
dfs(1,1);
cout<<res;
return 0;
}