Submission #1301695

#TimeUsernameProblemLanguageResultExecution timeMemory
1301695efegThe Xana coup (BOI21_xanadu)C++20
55 / 100
38 ms17252 KiB
#include <bits/stdc++.h>
using namespace std; 

#define sz(v) (int) v.size()
#define pb push_back
#define popcount(x) __builtin_popcount(x)

using i64 = long long; 
template<typename T>
using vec = vector<T>; 

template<typename T>
void  chmin(T &a,T b){ a = min(a,b); }

int n; 
vec<vec<int>> adj; 
vec<int> col; 

i64 dp[100100][2][2]; 

void dfs(int node,int p){
    if (sz(adj[node]) == 1 && p != -1){
        dp[node][col[node]][0] = 0; 
        dp[node][(col[node] + 1) % 2][1] = 1; 
        return; 
    }

    for (auto x : adj[node]){
        if (x == p) continue; 
        dfs(x,node); 
    }

    for (int mask = 0; mask < (1 << sz(adj[node])); mask++){
        i64 ans1 = 0,ans2 = 0; 
        int cnt = 0; 
        for (int x = 0; x < sz(adj[node]); x++){
            if (adj[node][x] == p) continue; 
            if (mask & (1 << x)){
                cnt++; 
                ans1 += dp[adj[node][x]][0][1]; 
                ans2 += dp[adj[node][x]][1][1]; 
            } 
            else {
                ans1 += dp[adj[node][x]][0][0]; 
                ans2 += dp[adj[node][x]][1][0]; 
            }
        }   
        if (cnt & 1){
            chmin(dp[node][(col[node]+1) % 2][0],ans1); 
            chmin(dp[node][col[node]][1],ans2 + 1); 
        }
        else {
            chmin(dp[node][col[node]][0],ans1); 
            chmin(dp[node][(col[node]+1) % 2][1],ans2 + 1); 
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); 
    
    cin >> n; 
    adj.assign(n,vec<int>()); 
    col.assign(n,0); 
    for (int i = 0; i < n-1; i++){
        int u,v; cin >> u >> v; 
        u--; v--; 
        adj[u].pb(v); 
        adj[v].pb(u); 
    }
    for (int i = 0; i < n; i++) cin >> col[i]; 

    for (int i = 0; i < n; i++){
        for (int j = 0; j < 2; j++){
            for (int k = 0; k < 2 ; k++){
                dp[i][j][k] = INT_MAX;
            }
        }
    }

    dfs(0,-1); 

    i64 ans = min(dp[0][0][0],dp[0][0][1]); 
    if (ans == INT_MAX) cout << "impossible" << endl;
    else cout << ans << endl; 

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