Submission #1317782

#TimeUsernameProblemLanguageResultExecution timeMemory
1317782guardianecThe Xana coup (BOI21_xanadu)C++20
100 / 100
48 ms19068 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll n;
vector<vector<ll>> adj;
vector<ll> a;

ll dp[100007][2][2];

void dfs(ll u, ll p) {
    for (int i=0; i<2; i++){
        for (int j=0; j<2; j++){
            dp[u][i][j] = INT_MAX;
        }
    }

    ll k1 = 0;
    ll k2 = INT_MAX;

    ll t1 = 1;
    ll t2 = INT_MAX;

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

        ll nk1 = min(k1 + dp[v][0][0], k2 + dp[v][1][0]);
        ll nk2 = min(k2 + dp[v][0][0], k1 + dp[v][1][0]);

        k1 = min((ll)INT_MAX, nk1);
        k2 = min((ll)INT_MAX, nk2);
        
        ll nt1 = min(t1 + dp[v][0][1], t2 + dp[v][1][1]);
        ll nt2 = min(t2 + dp[v][0][1], t1 + dp[v][1][1]);

        t1 = min((ll)INT_MAX, nt1);
        t2 = min((ll)INT_MAX, nt2);
    }

    dp[u][0][a[u]] = k1;
    dp[u][0][1-a[u]] = k2;

    dp[u][1][1-a[u]] = t1;
    dp[u][1][a[u]] = t2;
}

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

    cin >> n;
    adj.resize(n+1);
    a.resize(n+1);

    for (int i=0; i<n-1; i++){
        ll 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);

    ll res = min(dp[1][0][0], dp[1][1][0]);

    if (res>=INT_MAX) cout << "impossible";
    else cout << res;
}
#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...