Submission #1307669

#TimeUsernameProblemLanguageResultExecution timeMemory
1307669shivenbhargavaThe Xana coup (BOI21_xanadu)C++20
100 / 100
36 ms15260 KiB
#include "bits/stdc++.h" using namespace std; const int MAXN = 100005; const int INF = 2147483647; int yes[MAXN],no[MAXN],diffyes[MAXN],diffno[MAXN]; vector<int> graph[MAXN]; bool states[MAXN]; int cur,total,mindiff; bool possible; void dfs(int u, int v) { for (int i : graph[u]) if (i != v) dfs(i,u); cur = 0, total = 0, mindiff = INF; possible = true; for (int i : graph[u]) { if (i == v) continue; if (yes[i]<no[i]) cur++; if (min(yes[i],no[i]) == INF) { possible = false; break; } total+=min(yes[i],no[i]); if (max(yes[i],no[i]) != INF) mindiff = min(mindiff,abs(yes[i]-no[i])); } if (possible) { if (cur%2 == states[u]) { no[u] = total; if (mindiff!=INF) diffno[u] = total+mindiff; } else { diffno[u] = total; if (mindiff!=INF) no[u] = total+mindiff; } } cur = 1, total = 1, mindiff = INF; possible = true; for (int i : graph[u]) { if (i == v) continue; if (diffyes[i]<diffno[i]) cur++; if (min(diffyes[i],diffno[i]) == INF) { possible = false; break; } total+=min(diffyes[i],diffno[i]); if (max(diffyes[i],diffno[i]) != INF) mindiff = min(mindiff,abs(diffyes[i]-diffno[i])); } if (possible) { if (cur%2 == states[u]) { yes[u] = total; if (mindiff!=INF) diffyes[u] = total+mindiff; } else { diffyes[u] = total; if (mindiff!=INF) yes[u] = total+mindiff; } } } int main() { #ifdef LOCAL freopen("submission/input.in", "r", stdin); freopen("submission/output.out", "w", stdout); #else ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); #endif int n; cin >> n; for (int i = 1; i<n; i++) { int x,y; cin >> x >> y; graph[x].push_back(y); graph[y].push_back(x); } for (int i = 1; i<=n; i++) cin >> states[i]; fill(yes,yes+MAXN,INF); fill(no,no+MAXN,INF); fill(diffyes,diffyes+MAXN,INF); fill(diffno,diffno+MAXN,INF); dfs(1,0); int x = min(yes[1],no[1]); if (x == INF) cout << "impossible\n"; else cout << x << '\n'; 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...