Submission #1273540

#TimeUsernameProblemLanguageResultExecution timeMemory
1273540KindaGoodGamesThe Xana coup (BOI21_xanadu)C++20
10 / 100
98 ms33232 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()/2; int r = -1; vector<bool> ostate; void DFS(int v, int p){ 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...