Submission #762297

#TimeUsernameProblemLanguageResultExecution timeMemory
762297SharkyThe Xana coup (BOI21_xanadu)C++17
100 / 100
48 ms23564 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 1E5+5;
const int INF = 1E9;
int n, dp[maxn][2][2], b[maxn]; // colours AFTER flipping, times flipped
bool cn[maxn][2][2];
vector<int> adj[maxn];

void dfs(int u, int p) {
    // cout << u << " " << p << endl;
    for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) {
        dp[u][i][j] = INF;
    }
    // int one[2][2];
    // for (int i = 0; i < 2; i++) {
    //     for (int j = 0; j < 2; j++) {
    //         cn[u][i][j] = (b[u] == (i ^ j));
    //         one[i][j] = 0;
    //     }
    // }
    int child = 0;
    for (int v : adj[u]) {
        if (v == p) continue;
        dfs(v, u);
        child++;
        // cn[u][0][0] = (cn[u][0][0] & cn[v][0][0]);
        // cn[u][1][0] = (cn[u][1][0] & cn[v][0][0]);
        // cn[u][0][1] = (cn[u][0][1] & cn[v][1][0]);
        // cn[u][1][1] = (cn[u][1][1] & cn[v][1][0]);
    }
    // for (int i = 0; i < 2; i++) {
    //     for (int j = 0; j < 2; j++) {
    //         if (!cn[u][i][j]) continue;
    //         for (int v : adj[u]) {
    //             if (v == p) continue;
    //             dp[u][i][j] += dp[v][j][0] + j;
    //         }
    //     }
    // }

    for (int k = 0; k < 2; k++) {     
        int i = 0, one[2][2];
        one[0][0] = one[1][0] = 0;
        one[0][1] = one[1][1] = INF;
        for (int v : adj[u]) {
            if (v == p) continue;
            one[i][0] = min({one[i ^ 1][1] + dp[v][k][1], one[i ^ 1][0] + dp[v][k][0]});
            one[i][1] = min({one[i ^ 1][0] + dp[v][k][1], one[i ^ 1][1] + dp[v][k][0]});
            // cout << "ones: " << one[i][0] << " " << one[i][1] << "\n";
            i = i ^ 1;
        }
        // cout << (i ^ 1) << " " << k << " " << one[0][0] << " " << one[0][1] << " " << one[1][0] << " " << one[1][1] << "\n";
        // cout << (i ^ 1) << " " << (b[u] ^ k) << endl;
        dp[u][b[u] ^ k][k] = min(dp[u][b[u] ^ k][k], one[i ^ 1][0]);
        dp[u][b[u] ^ 1 ^ k][k] = min(dp[u][b[u] ^ 1 ^ k][k], one[i ^ 1][1]);
    }
    dp[u][0][1]++, dp[u][1][1]++;
    // for (int i = 0; i < 2; i++) {
    //     for (int j = 0; j < 2; j++) {
    //         if (b[u] != (i ^ j)) dp[u][i][j] = INF;
    //     }
    // }
    // cout << u << endl;
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            // cout << ((i == 0) ? "off " : "on ") <<((j == 0) ? "noflip " : "flip ") << dp[u][i][j] << ' ';
        }
        // cout << '\n';
    }
}

int32_t main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n;
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for (int i = 1; i <= n; i++) cin >> b[i];
    dfs(1, 0);
    int mn = 1E18;
    for (int j = 0; j < 2; j++) {
        mn = min(mn, dp[1][0][j]);
    }
    if (mn > n) cout << "impossible\n";
    else cout << mn << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...