Submission #1331735

#TimeUsernameProblemLanguageResultExecution timeMemory
1331735benjaminshihDeblo (COCI18_deblo)C++20
90 / 90
317 ms17268 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int mxn = 2e5 + 10;
int w[mxn];
vector<int> g[mxn];
ll dp[mxn][2];
ll total_paths_with_bit;

void dfs(int u, int p, int bit) {
    int b = (w[u] >> bit) & 1;
    dp[u][b] = 1;
    dp[u][1 - b] = 0;
    
    total_paths_with_bit += dp[u][1];

    for (int v : g[u]) {
        if (v == p) continue;
        dfs(v, u, bit);

    
    
        total_paths_with_bit += (dp[u][0] * dp[v][1] + dp[u][1] * dp[v][0]);

    
        if (b == 0) {
            dp[u][0] += dp[v][0];
            dp[u][1] += dp[v][1];
        } else {
            dp[u][0] += dp[v][1];
            dp[u][1] += dp[v][0];
        }
    }
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n;
    if (!(cin >> n)) return 0;

    for (int i = 1; i <= n; i++) cin >> w[i];
    for (int i = 0; i < n - 1; i++) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    ll final_ans = 0;
    for (int i = 0; i <= 30; i++) {
        total_paths_with_bit = 0;
        dfs(1, 0, i);
        final_ans += (total_paths_with_bit * (1LL << i));
    }

    cout << final_ans << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...