Submission #1225046

#TimeUsernameProblemLanguageResultExecution timeMemory
1225046wedonttalkanymoreThe Xana coup (BOI21_xanadu)C++20
0 / 100
51 ms21828 KiB
#include <bits/stdc++.h>
using namespace std;

const int inf = 1e9;
int n, a[100005];
vector<int> adj[100005];
int dp[100005][2][2];

void dfs(int u, int par) {
    vector<int> child;
    for (int v : adj[u]) {
        if (v != par) {
            dfs(v, u);
            child.push_back(v);
        }
    }

    int m = child.size();
    vector<array<array<int, 2>, 2>> f(m + 1, {{{inf, inf}, {inf, inf}}});

    f[0][0][a[u]]   = 0;
    f[0][1][a[u] ^ 1] = 0;

    for (int i = 1; i <= m; i++) {
        int v = child[i - 1];
        for (int p = 0; p < 2; p++) {
            for (int t = 0; t < 2; t++) {
                if (f[i - 1][p][t] >= inf) continue;
                f[i][p][t]     = min(f[i][p][t],     f[i - 1][p][t] + dp[v][0][0]);
                f[i][p][t]     = min(f[i][p][t],     f[i - 1][p][t] + dp[v][1][0]);
                f[i][p][t ^ 1] = min(f[i][p][t ^ 1], f[i - 1][p][t] + dp[v][0][1]);
                f[i][p][t ^ 1] = min(f[i][p][t ^ 1], f[i - 1][p][t] + dp[v][1][1]);
            }
        }
    }

    dp[u][0][0] = f[m][0][0];
    dp[u][0][1] = f[m][0][1];
    dp[u][1][0] = f[m][1][0] + 1;
    dp[u][1][1] = f[m][1][1] + 1;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    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 >> a[i];

    dfs(1, 0);
    int res = min(dp[1][0][0], dp[1][1][0]);
    cout << (res >= inf ? "impossible" : to_string(res)) << '\n';

    return 0;
}
#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...