Advertisement
tuki2501

coci2021_r1_papricice.cpp

Jan 10th, 2022 (edited)
740
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5.  
  6. const int N = 200005;
  7.  
  8. vector<int> adj[N];
  9. int cnt[N], res = INT_MAX;
  10. multiset<int> ms;
  11.  
  12. int cal(int x, int sum, int c, bool b = 0) {
  13.   auto it = ms.lower_bound(x);
  14.   if (b) {
  15.     if (it == ms.begin()) return INT_MAX;
  16.     it = prev(it);
  17.   }
  18.   if (it == ms.end()) return INT_MAX;
  19.   return max({sum - *it, *it, c}) - min({sum - *it, *it, c});
  20. }
  21.  
  22. void binsearch(int sum, int c) {
  23.   int l = 0, r = sum, ans = INT_MAX;
  24.   while (l <= r) {
  25.     int x = (l + r) / 2;
  26.     if (cal(x, sum, c, 1) >= cal(x, sum, c)) {
  27.       l = x + 1;
  28.       ans = x;
  29.     }
  30.     else r = x - 1;
  31.   }
  32.   res = min({res, cal(ans, sum, c), cal(ans + 1, sum, c)});
  33. }
  34.  
  35. void dfs1(int i, int p) {
  36.   cnt[i] = 1;
  37.   for (auto &j : adj[i]) {
  38.     if (j == p) continue;
  39.     dfs1(j, i);
  40.     cnt[i] += cnt[j];
  41.   }
  42. }
  43.  
  44. void dfs2(int i, int p, int sum) {
  45.   sum += cnt[i];
  46.   for (auto &j : adj[i]) {
  47.     if (j == p) continue;
  48.     sum -= cnt[j];
  49.     ms.insert(sum);
  50.     binsearch(sum, cnt[j]);
  51.     dfs2(j, i, sum);
  52.     ms.erase(ms.find(sum));
  53.     sum += cnt[j];
  54.   }
  55. }
  56.  
  57. void dfs3(int i, int p) {
  58.   for (auto &j : adj[i]) {
  59.     if (j == p) continue;
  60.     binsearch(cnt[1] - cnt[j], cnt[j]);
  61.     dfs3(j, i);
  62.   }
  63.   ms.insert(cnt[i]);
  64. }
  65.  
  66. signed main() {
  67.   cin.tie(0)->sync_with_stdio(0);
  68.   int n; cin >> n;
  69.   for (int i = 1; i < n; i++) {
  70.     int u, v;
  71.     cin >> u >> v;
  72.     adj[u].push_back(v);
  73.     adj[v].push_back(u);
  74.   }
  75.   dfs1(1, 0);
  76.   dfs2(1, 0, 0);
  77.   ms.clear();
  78.   dfs3(1, 0);
  79.   cout << res << '\n';
  80. }
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement