Submission #1228341

#TimeUsernameProblemLanguageResultExecution timeMemory
1228341countlessThe Xana coup (BOI21_xanadu)C++20
100 / 100
45 ms13896 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;

#define sp <<" "<<
#define endl "\n"

const int MAXN = 1e5;
const int INF = 1e9+5;

int n;
vector<int> val;
vector<vector<int>> adj;

int dp[MAXN][2][2];

void dfs(int u, int p = -1) {
    for (int f = 0; f < 2; f++) {
        dp[u][f][val[u] ^ f] = f;
        dp[u][f][val[u] ^ f ^ 1] = INF;
    }

    for (auto &v : adj[u]) {
        if (v == p) continue;

        dfs(v, u);

        for (int f = 0; f < 2; f++) {
            int o0 = dp[u][f][0], o1 = dp[u][f][1];
            dp[u][f][0] = min({INF, o0 + dp[v][0][f], o1 + dp[v][1][f]});
            dp[u][f][1] = min({INF, o0 + dp[v][1][f], o1 + dp[v][0][f]});
        }
    }
}

void solve() {
    cin >> n;
    val.resize(n);
    adj.assign(n, {});

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

    for (int i = 0; i < n; i++) {
        cin >> val[i];
    }

    int root = 0;
    dfs(root);

    int ans = min(dp[root][0][0], dp[root][1][0]);

    cout << (ans > n ? "impossible" : to_string(ans)) << endl;
}

signed main() {
    cin.tie(0);
    ios_base::sync_with_stdio(false);

    int t = 1;
    // cin >> t;
    while (t--)
        solve();
}
#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...