Submission #399257

#TimeUsernameProblemLanguageResultExecution timeMemory
399257retsigerPapričice (COCI20_papricice)C++14
110 / 110
225 ms21584 KiB
#include<bits/stdc++.h>
#define bug(x) cerr<<#x<<" = "<<x<<'\n'

using namespace std;

const int maxn = 200100, INF = 1e9;

int N, ch[maxn], ans;
vector <int> G[maxn];
set <int> A, B;

void check(int a, int b, int c) {
  int x = max({a, b, c});
  int y = min({a, b, c});
  ans = min(ans, x - y);
}

void prep(int u, int p = -1) {
  ch[u] = 1;
  for (int v : G[u]) if (v != p) {
    prep(v, u);
    ch[u] += ch[v];
  }
}

void dfs(int u, int p = -1) {
  auto it = A.lower_bound((N + ch[u]) / 2);
  check(ch[u], *it - ch[u], N - *it);
  if (it != A.begin()) {
    --it;
    check(ch[u], *it - ch[u], N - *it);
  }

  auto ti = B.lower_bound((N - ch[u]) / 2);
  check(ch[u], *ti, N - ch[u] - *ti);
  if (ti != B.begin()) {
    --ti;
    check(ch[u], *ti, N - ch[u] - *ti);
  }

  A.insert(ch[u]);
  for (int v : G[u]) if (v != p) {
    dfs(v, u);
  }
  A.erase(ch[u]);
  B.insert(ch[u]);
}

int main() {
  ios::sync_with_stdio(0); cin.tie(0);
//  freopen("cc.inp", "r", stdin);
//  freopen("cc.out", "w", stdout);
  cin >> N;
  for (int u, v, i = 1; i < N; ++i) {
    cin >> u >> v;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  ans = INF;
  prep(1);
  dfs(1);
  cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...