Submission #735586

#TimeUsernameProblemLanguageResultExecution timeMemory
735586Koful123Papričice (COCI20_papricice)C++17
50 / 110
6 ms6808 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 = 1e5 + 5; int ans = 1e18,n; vector<int> adj[N],sz(N); multiset<int> other,anc; void calc(int node,int p){ sz[node] = 1; for(int go : adj[node]){ if(go == p) continue; calc(go,node); sz[node] = sz[go] + sz[node]; } } int search(multiset<int> &s,int x,int ty){ int res = 1e18,cur = x; if(!ty) cur = (n - x) / 2 + x; else cur = (n - x) / 2; auto it = s.upper_bound(cur); if(ty){ if(it != s.end()){ vector<int> tmp = {x,n - x - *it,*it}; sort(tmp.begin(), tmp.end()); res = min(res,tmp[2] - tmp[0]); } if(it != s.begin()){ vector<int> tmp = {x,n - *prev(it) - x,*prev(it)}; sort(tmp.begin(), tmp.end()); res = min(res,tmp[2] - tmp[0]); } return res; } if(it != s.end()){ vector<int> tmp = {x,n - *it,*it - x}; sort(tmp.begin(), tmp.end()); res = min(res,tmp[2] - tmp[0]); } if(it != s.begin()){ vector<int> tmp = {x,n - *prev(it),*prev(it) - x}; sort(tmp.begin(), tmp.end()); res = min(res,tmp[2] - tmp[0]); } return res; } void dfs(int node,int p){ ans = min({ans,search(anc,sz[node],0),search(other,sz[node],1)}); anc.insert(sz[node]); for(int go : adj[node]){ if(go == p) continue; dfs(go,node); } anc.erase(anc.find(sz[node])); other.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); } calc(1,0); dfs(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...