Submission #732951

#TimeUsernameProblemLanguageResultExecution timeMemory
732951Koful123Papričice (COCI20_papricice)C++17
0 / 110
7 ms16024 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define endl "\n" #define ff first #define ss second #define pb push_back #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() const int N = 2e5 + 5; int ans = 1e18,n; multiset<int> s[N]; vector<int> adj[N],sz(N); void merge(multiset<int> &a,multiset<int> &b){ if(a.size() < b.size()) swap(a,b); for(int x : b){ a.insert(x); } } void dfs(int node,int p){ sz[node] = 1; for(int go : adj[node]){ if(go == p) continue; dfs(go,node); sz[node] += sz[go]; merge(s[node],s[go]); } s[node].insert(sz[node]); auto f = s[node].upper_bound(sz[node] / 2); if(f != s[node].end()){ vector<int> tmp = {*f,sz[node] - *f,n - sz[node]}; sort(tmp.begin(),tmp.end()); ans = min(ans,tmp[2] - tmp[0]); } if(f != s[node].begin()){ auto s = prev(f); vector<int> tmp = {*s,sz[node] - *s,n - sz[node]}; sort(tmp.begin(),tmp.end()); ans = min(ans,tmp[2] - tmp[0]); } } void calc(int node,int p){ s[1].erase(sz[node]); for(int go : adj[node]){ if(go == p) continue; dfs(go,node); } auto f = s[1].upper_bound((n - sz[node]) / 2); if(f != s[1].end()){ vector<int> tmp = {sz[node],*f,n - sz[node] - *f}; sort(tmp.begin(),tmp.end()); ans = min(ans,tmp[2] - tmp[0]); } if(f != s[1].begin()){ auto s = prev(f); vector<int> tmp = {*s,sz[node],n - sz[node] - *s}; sort(tmp.begin(),tmp.end()); ans = min(ans,tmp[2] - tmp[0]); } s[1].insert(sz[node]); } void solve(){ cin >> n; for(int i = 1; i < n; i++){ int a,b; cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); } dfs(1,0); calc(1,0); cout << ans << endl; } signed main(){ ios::sync_with_stdio(0); cin.tie(0); int t = 1; // cin >> t; while(t--) solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...