Submission #1340796

#TimeUsernameProblemLanguageResultExecution timeMemory
1340796LIAMeetings 2 (JOI21_meetings2)C++17
0 / 100
0 ms344 KiB
//
// Created by liasa on 22/03/2026.
//
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define v vector
#define lp(i, s, e) for (ll i = s; i < e; ++i)
#define pll pair<ll, ll>
#define tpl tuple<ll, ll, ll>
// bl,dsu,edges
ll logi = 20;
ll n;
v<v<pll>> g;
v<v<ll>> bl;
v<ll> dep, sz, eg_e;
v<tpl> edges;

void dfs(ll node, ll par, ll d) {
  dep[node] = d;
  sz[node] = 1;
  for (auto [it, eg] : g[node]) {
    if (it != par) {
      dfs(it, node, d + 1);
      bl[it][0] = node;
      sz[node] += sz[it];
      eg_e[eg] = min(sz[it], n - sz[it]);
    }
  }
}

void build_bl() {
  lp(j, 1, logi) {
    lp(i, 0, n) { bl[i][j] = bl[bl[i][j - 1]][j - 1]; }
  }
}

ll find(ll a, ll b) {
  if (a == b)
    return a;

  if (dep[a] > dep[b])
    swap(a, b);

  ll dif = dep[b] - dep[a];
  lp(j, 0, logi) {
    if ((1LL << j) & dif) {
      b = bl[b][j];
    }
  }

  if (a == b)
    return a;

  for (ll j = logi - 1; j >= 0; --j) {
    if (bl[a][j] != bl[b][j]) {
      a = bl[a][j], b = bl[b][j];
    }
  }

  a = bl[a][0];
  return a;
}
ll dist(ll a, ll b) {
  ll lca = find(a, b);
  return (dep[a] + dep[b] - 2 * dep[lca]);
}

struct Dsu {
  v<ll> par;
  v<pair<ll, pll>> diam;
  ll sol = 0;
  Dsu() {
    par.resize(n);
    iota(par.begin(), par.end(), 0);
    diam.resize(n);
    for (ll i = 0; i < n; i++)
      diam[i] = {0, {i, i}};
  }

  ll find(ll e) {
    if (par[e] == e)
      return e;
    return par[e] = find(par[e]);
  }

  void uni(ll a, ll b) {
    ll x = find(a), y = find(b);
    if (x == y)
      return;
    diam[x] = max(diam[x], {{dist(x, y)}, {x, y}});
    par[y] = x;
    diam[x] = max(diam[x], diam[y]);
    v<ll> f = {diam[x].second.first, diam[x].second.second};
    v<ll> s = {diam[y].second.first, diam[y].second.second};
    for (auto A : f) {
      for (auto B : s) {
        diam[x] = max(diam[x], {dist(A, B), {A, B}});
      }
    }
    sol = max(sol, diam[x].first);
  }
};

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;
  g.resize(n);
  bl.resize(n, v<ll>(logi));
  dep.resize(n);
  sz.resize(n);
  eg_e.resize(n - 1);
  edges.resize(n - 1);
  lp(i, 0, n - 1) {
    ll a, b;
    cin >> a >> b;
    a--;
    b--;
    edges[i] = {i, a, b};
    g[a].push_back({b, i});
    g[b].push_back({a, i});
  }

  dfs(0, -1, 0);

  build_bl();

  lp(i, 0, n - 1) { get<0>(edges[i]) = eg_e[i]; }

  sort(edges.begin(), edges.end());
  reverse(edges.begin(), edges.end());

  Dsu dsu;

  v<ll> ans(n);
  ll idx = 0;
  for (ll i = n - 1; i >= 0; --i) {
    if (!(i & 1))
      ans[i] = 1;
    else {
      while (idx < n - 1) {
        auto [c, a, b] = edges[idx];
        if (c < (i + 1) / 2)
          break;
        dsu.uni(a, b);
        idx++;
      }
      ans[i] = dsu.sol + 1;
    }
  }
  lp(i, 0, n) cout << ans[i] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...