Submission #1272636

#TimeUsernameProblemLanguageResultExecution timeMemory
1272636nerrrminThe Xana coup (BOI21_xanadu)C++20
100 / 100
40 ms18752 KiB
#include<bits/stdc++.h> #define endl '\n' #define pb push_back using namespace std; const int maxn = 1e5 + 10; void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } int n, a[maxn]; vector < int > g[maxn]; int dp[maxn][2][2]; void dfs(int beg, int from) { int sz = 0; vector < int > v; for (auto nb: g[beg]) { if(nb == from)continue; sz ++; dfs(nb, beg); v.pb(nb); } if(sz == 0) { if(a[beg] == 0) { dp[beg][0][0] = 0; dp[beg][1][1] = 1; } else { dp[beg][1][0] = 0; dp[beg][0][1] = 1; } /// cout << "* " << beg << endl; // cout << dp[beg][0][0] << " " << dp[beg][1][0] << endl; // cout << dp[beg][0][1] << " " << dp[beg][1][1] << endl; return; } // cout << "SOLVING " << beg << endl; /// solve togged /// iskam dr da sa 1 //cout << "case 1: togged." << endl; int sum0 = 0, sum1 = 1e9; for (auto nb: v) { int updsum0 = 1e9, updsum1 = 1e9; if(dp[nb][1][0] != -1) { updsum0 = sum0 + dp[nb][1][0]; updsum1 = sum1 + dp[nb][1][0]; } if(dp[nb][1][1] != -1) { updsum0 = min(updsum0, sum1 + dp[nb][1][1]); updsum1 = min(updsum1, sum0 + dp[nb][1][1]); } sum0 = updsum0; sum1 = updsum1; // cout << nb << "::: " << sum0 << " " << sum1 << endl; } if(a[beg]) { dp[beg][0][1] = sum0 + 1; dp[beg][1][1] = sum1 + 1; } else { dp[beg][1][1] = sum0 + 1; dp[beg][0][1] = sum1 + 1; } if(dp[beg][1][1] >= 1e9)dp[beg][1][1] = -1; if(dp[beg][0][1] >= 1e9)dp[beg][0][1] = -1; /// ne e togged // cout << "case 2: not togged" << endl; sum0 = 0; sum1 = 1e9; for (auto nb: v) { int updsum0 = 1e9, updsum1 = 1e9; if(dp[nb][0][0] != -1) { updsum0 = sum0 + dp[nb][0][0]; updsum1 = sum1 + dp[nb][0][0]; } if(dp[nb][0][1] != -1) { updsum0 = min(updsum0, sum1 + dp[nb][0][1]); updsum1 = min(updsum1, sum0 + dp[nb][0][1]); } sum0 = updsum0; sum1 = updsum1; // cout << nb << "::: " << sum0 << " " << sum1 << endl; } if(a[beg]) { dp[beg][0][0] = sum1 ; dp[beg][1][0] = sum0 ; } else { dp[beg][1][0] = sum1 ; dp[beg][0][0] = sum0 ; } if(dp[beg][1][0] >= 1e9)dp[beg][1][0] = -1; if(dp[beg][0][0] >= 1e9)dp[beg][0][0] = -1; // cout << "* " << beg << endl; // cout << dp[beg][0][0] << " " << dp[beg][1][0] << endl; // cout << dp[beg][0][1] << " " << dp[beg][1][1] << endl; } int main() { speed(); cin >> n; for (int i = 1; i < n; ++ i) { int a, b; cin >> a >> b; g[a].pb(b); g[b].pb(a); } for (int i = 1; i <= n; ++ i) cin >> a[i]; memset(dp, -1, sizeof(dp)); dfs(1, -1); int res = 1e9; if(dp[1][0][0] != -1)res = min(res, dp[1][0][0]); if(dp[1][0][1] != -1)res = min(res, dp[1][0][1]); if(res == 1e9)cout << "impossible" << endl; else cout << res << 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...