Submission #1016147

#TimeUsernameProblemLanguageResultExecution timeMemory
1016147vjudge1Papričice (COCI20_papricice)C++17
110 / 110
175 ms23376 KiB
#include<bits/stdc++.h> using namespace std; const int N = 200'000 + 50; vector<int> G[N]; int n, ans, sz[N]; set<int> s, sp; void dfs(int v, int p = 0) { sz[v] = 1; for(int u : G[v]) if(p != u) dfs(u, v), sz[v] += sz[u]; } void update(int x, int y, int z) { ans = min(ans, max(x, max(y, z)) - min(x, min(y, z))); } void dfs2(int v, int p = 0) { s.insert(sz[v]); for(int u : G[v]) { if(p == u) continue; int v1 = sz[u] + (n - sz[u]) / 2; int v2 = (n - sz[u]) / 2; auto it = s.upper_bound(v1); if(it != s.end()) update(sz[u], *it - sz[u], n - *it); if(it != s.begin()) { it--; update(sz[u], *it - sz[u], n - *it); } it = sp.upper_bound(v2); if(it != sp.end()) update(sz[u], *it, n - sz[u] - *it); if(it != sp.begin()) { --it; update(sz[u], *it, n - sz[u] - *it); } dfs2(u, v); } s.erase(sz[v]); sp.insert(sz[v]); } int main() { cin >> n; ans = n; for(int i = 1; i < n; i++) { int u, v; cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } dfs(1); dfs2(1); cout << ans << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...