Submission #732920

#TimeUsernameProblemLanguageResultExecution timeMemory
732920Koful123Papričice (COCI20_papricice)C++17
15 / 110
11 ms16468 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 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); multiset<int> cur = s[1]; for(int x : s[1]){ cur.erase(cur.find(x)); auto f = cur.upper_bound((n - x) / 2); if(f != cur.end()){ vector<int> tmp = {x,*f,n - x - *f}; sort(tmp.begin(),tmp.end()); ans = min(ans,tmp[2] - tmp[0]); } if(f != cur.begin()){ auto s = prev(f); vector<int> tmp = {x,*s,n - *s - x}; sort(tmp.begin(),tmp.end()); ans = min(ans,tmp[2] - tmp[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...