NC20857 Xor Path(dfs)
考虑一个点被使用的奇偶次
这种题如果是边的话,就是经典套路
现在是点,其实可以把他周围的边都计算一遍就知道这个点用了多少次
同时不要忘了加上以他为顶点的n-1条路
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e6+10; const ll inf=0x3f3f3f3f3f3f3f3f; const int mod=1e9+7; int h[N],ne[N],e[N],idx; ll sz[N],a[N]; ll ans; int n; void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void dfs(int u,int fa){ sz[u]=1; int i; ll sum=n-1; for(i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(j==fa) continue; dfs(j,u); sz[u]+=sz[j]; sum+=(sz[j])*(n-sz[j]); } sum+=(sz[u])*(n-sz[u]); sum/=2; if(sum%2){ ans^=a[u]; } } int main(){ ios::sync_with_stdio(false); memset(h,-1,sizeof h); int i; cin>>n; for(i=1;i<n;i++){ int a,b; cin>>a>>b; add(a,b); add(b,a); } for(i=1;i<=n;i++) cin>>a[i]; dfs(1,0); cout<<ans<<endl; return 0; }
没有人不辛苦,只有人不喊疼