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;
}
View Code

 

posted @ 2021-03-01 20:07  朝暮不思  阅读(56)  评论(0编辑  收藏  举报