Submission #986519

#TimeUsernameProblemLanguageResultExecution timeMemory
986519HiepVu217Papričice (COCI20_papricice)C++17
110 / 110
185 ms29940 KiB
#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 5; const int oo = 1e9; #define sz(a) (int)a.size() #define eb emplace_back using pii = pair<int, int>; int n; namespace arcv { int n; vector<int> adj[N]; int par[N]; int sz[N]; int st[N]; int en[N]; int tour[N]; int ans = oo; int times = 0; multiset<int> S; void calc_sz(int u, int p) { par[u] = p; sz[u] = 1; for(int v : adj[u]) { if(v == p) continue; calc_sz(v, u); sz[u] += sz[v]; } } int get(int a, int b, int c) { return max({a, b, c}) - min({a, b, c}); } void DFS1(int u, int p) { auto it = S.lower_bound((n - sz[u]) / 2); if(it != S.end()) ans = min(ans, get(sz[u], *it, n - sz[u] - (*it))); if(it != S.begin()) --it; if(it != S.end()) ans = min(ans, get(sz[u], *it, n - sz[u] - (*it))); for(int v : adj[u]) { if(v == p) continue; DFS1(v, u); } S.emplace(sz[u]); en[u] = times; } void DFS2(int u, int p) { auto it = S.lower_bound((n + sz[u]) / 2); if(it != S.end()) ans = min(ans, get((*it) - sz[u], sz[u], n - (*it))); if(it != S.begin()) --it; if(it != S.end()) ans = min(ans, get((*it) - sz[u], sz[u], n - (*it))); S.emplace(sz[u]); for(int v : adj[u]) { if(v == p) continue; DFS2(v, u); } S.erase(S.find(sz[u])); } void solution() { cin >> n; for(int i = 1; i < n; i++) { int u, v; cin >> u >> v; adj[u].eb(v); adj[v].eb(u); } calc_sz(1, 0); DFS1(1, 0); S.clear(); DFS2(1, 0); cout << ans; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); arcv::solution(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...