제출 #1225075

#제출 시각아이디문제언어결과실행 시간메모리
1225075wedonttalkanymoreThe Xana coup (BOI21_xanadu)C++20
0 / 100
65 ms29508 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long; 

const ll inf = 1e12;

int n, a[100005];
vector <int> adj[100005];
ll dp[100005][2][2];

void dfs(int u, int par) {
    for (auto v : adj[u]) {
        if (v != par) {
            dfs(v, u);
        }
    }
    vector <int> child;
    for (auto v : adj[u]) {
        if (v != par) {
            child.push_back(v);
        }
    }
    array<array<ll, 2>, 2> cur;
    cur[0][0] = 0;
    cur[0][1] = 0;
    cur[1][0] = inf;
    cur[1][1] = inf;

    for (int v : child) {
        array<array<ll, 2>, 2> nxt;
        for (int k = 0; k < 2; k++) {
            for (int j = 0; j < 2; j++) {
                nxt[k][j] = inf;
            }
        }
        for (int k = 0; k < 2; k++) {
            for (int j = 0; j < 2; j++) {
                if (cur[k][j] >= inf) continue;
                if (nxt[k][j] > cur[k][j] + dp[v][0][j]) {
                    nxt[k][j] = cur[k][j] + dp[v][0][j];
                }
                int nk = k ^ 1;
                if (nxt[nk][j] > cur[k][j] + dp[v][1][j]) {
                    nxt[nk][j] = cur[k][j] + dp[v][1][j];
                }
            }
        }
        cur = nxt;
    }

    dp[u][0][a[u]] = min(inf, cur[0][0]);
    dp[u][1][a[u]] = min(inf, 1 + cur[1][1]);
    dp[u][0][a[u]^1] = min(inf, cur[0][1]);
    dp[u][1][a[u]^1] = min(inf, 1 + cur[1][0]);
}

signed main() {
    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];
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < 2; j++) {
            for (int k = 0; k < 2; k++) {
                dp[i][j][k] = inf;
            }
        }
    }
    dfs(1, 0);
    ll ans = min(dp[1][0][0], dp[1][1][0]);
    if (ans >= inf) cout << "impossible";
    else cout << ans;
    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...