Submission #956048

#TimeUsernameProblemLanguageResultExecution timeMemory
956048shezittPapričice (COCI20_papricice)C++17
110 / 110
161 ms23720 KiB
#include <iostream> #include <vector> #include <algorithm> #include <set> #include <cassert> using namespace std; using ll = long long; #define int ll #define fore(i, a, b) for(int i=a; i<b; ++i) #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() #define pb(x) push_back(x) #define vi vector<int> const int N = 2e5+5; vi adj[N]; int n; int tam[N]; void dfs(int x, int prev=-1){ tam[x] = 1; for(int child : adj[x]){ if(child == prev) continue; dfs(child, x); tam[x] += tam[child]; } } vi closest(int x, set<int> &A){ vi res; auto it = A.lower_bound(x); if(it != A.end()){ res.pb(*it); } if(it != A.begin()){ it--; res.pb(*it); } return res; } int balance(int x, int y, int z){ return max({x, y, z}) - min({x, y, z}); } int f(int x, set<int> &A, set<int> &B, int pre=-1){ // A -> Es ancestro // B -> No es ancestro int res = 1e9; // primer caso for(int p : closest((n + tam[x]) / 2, A)){ res = min(res, balance(tam[x], p-tam[x], n-p)); } // segundo caso for(int p : closest((n - tam[x]) / 2, B)){ res = min(res, balance(tam[x], p, n-tam[x]-p)); } A.insert(tam[x]); for(int child : adj[x]){ if(child == pre) continue; res = min(res, f(child, A, B, x)); } A.erase(tam[x]); B.insert(tam[x]); return res; } signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; fore(i, 0, n-1){ int u, v; cin >> u >> v; adj[u].pb(v); adj[v].pb(u); } dfs(1); set<int> A, B; int ans = f(1, A, B, -1); cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...