Submission #1273561

#TimeUsernameProblemLanguageResultExecution timeMemory
1273561KindaGoodGamesThe Xana coup (BOI21_xanadu)C++20
50 / 100
105 ms33112 KiB
#include<bits/stdc++.h>

using namespace std;

#define int long long
vector<vector<int>> adj;
vector<vector<vector<int>>> dp;  
// int INF = numeric_limits<int>::max()/8;
int INF = 2e5;
    int r = -1;
    vector<bool> ostate;

void DFS(int v, int p){
    // if v is a leaf, then not doing anything will cause the node to be in the same state or flipping it will cause it to go to the other state
    // no other dp-state can be reached
    if(v != r && adj[v].size() == 1){
        dp[v][ostate[v]][0] = 0; 
        dp[v][!ostate[v]][1] = 1; 
        return;
    }

    vector<int> child;
    for(auto u : adj[v]){
        if(u == p) continue;
        DFS(u,v);
        child.push_back(u);
    }

    if(child.size() == 1){
        int a = child[0];
        dp[v][ostate[v]][0] = dp[a][1][0];
        dp[v][!ostate[v]][0] = dp[a][1][1];
        
        dp[v][!ostate[v]][1] = dp[a][0][0]+1;
        dp[v][ostate[v]][1] = dp[a][0][1]+1;
    }else if(child.size() == 2){
        int a = child[0];
        int b = child[1];

        dp[v][ostate[v]][0] = min(dp[a][1][0]+dp[b][1][0], dp[a][1][1]+dp[b][1][1]);
        dp[v][!ostate[v]][0] = min(dp[a][1][0]+dp[b][1][1], dp[a][1][1]+dp[b][1][0]);
        
        dp[v][!ostate[v]][1] = min(dp[a][0][0]+dp[b][0][0], dp[a][0][1]+dp[b][0][1])+1;
        dp[v][ostate[v]][1] = min(dp[a][0][0]+dp[b][0][1], dp[a][0][1]+dp[b][0][0])+1;
    }
    cerr <<"";
}

int32_t main(){
    int n;
    cin >> n;
    adj.resize(n);
    dp = vector<vector<vector<int>>>(n, vector<vector<int>>(2, vector<int>(2,INF)));
    for(int i = 0; i < n-1LL; i++){
        int a,b;
        cin >> a >> b;
        a--;b--;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }

    ostate.resize(n);
    for(int i = 0; i < n; i++){
        int a;
        cin >> a;
        ostate[i] = a;
        ostate[i] = !ostate[i];
    }

    for(int i = 0; i < n; i++){
        if(adj[i].size() <= 2) {
            r = i;
            break;
        }
    }

    DFS(r,r);
    
    int ans = min({dp[r][1][0],dp[r][1][1]});
    if(ans >= INF){
        cout << "impossible\n";
        return 0;
    }

    cout << ans << 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...