ICPC NEAU Programming Contest 2020 M. 再來異或

在這裏插入圖片描述
思路:
每個邊的會算 siz[v](nsiz[v])siz[v]*(n-siz[v])次,只需要統計算了奇數次的邊。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>

using namespace std;

typedef long long ll;
const int maxn = 4e5 + 7;
const int INF = 0x3f3f3f3f;

int siz[maxn];
int head[maxn],nex[maxn],to[maxn],val[maxn],tot;
int ans,n;

void add(int x,int y,int z) {
    to[++tot] = y;
    val[tot] = z;
    nex[tot] = head[x];
    head[x] = tot;
}

void dfs(int u,int fa) {
    siz[u] = 1;
    for(int i = head[u];i;i = nex[i]) {
        int v = to[i],w = val[i];
        if(v == fa) continue;
        dfs(v,u);
        siz[u] += siz[v];
        ll num = 1ll * siz[v] * (n - siz[v]);
        if(num % 2 == 1) {
            ans ^= w;
        }
    }
}

int main() {
    int T;scanf("%d",&T);
    while(T--) {
        ans = 0;
        memset(head,0,sizeof(head));
        tot = 0;
        scanf("%d",&n);
        for(int i = 1;i < n;i++) {
            int x,y,z;scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);add(y,x,z);
        }
        dfs(1,-1);
        printf("%d\n",ans);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章