Submission #1258009

#TimeUsernameProblemLanguageResultExecution timeMemory
1258009LucaLucaMMeetings 2 (JOI21_meetings2)C++20
20 / 100
4093 ms13640 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <random>
#include <chrono>

using ll = long long;
#define debug(x) #x << " = " << x << '\n'

std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());

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

  int n;
  std::cin >> n;

  std::vector<std::vector<int>> g(n);

  for (int i = 1; i < n; i++) {
    int u, v;
    std::cin >> u >> v;
    u--, v--;
    // u = i;
    // v = rng() % i;
    g[u].push_back(v);
    g[v].push_back(u);
  }

  std::vector<int> score(n, 0);

  std::vector<int> sz(n);
  std::vector<int> dp(n);
  int answer = 0;

  auto dfs0 = [&](auto &&self, int u, int p) -> void {
    if (p != -1) {
      g[u].erase(std::find(g[u].begin(), g[u].end(), p));
    } 
    sz[u] = 1;
    for (int v : g[u]) {
      self(self, v, u);
      sz[u] += sz[v];
    }
  };

  auto dfs = [&](auto &&self, int u, int k) -> void {
    dp[u] = 0;
    for (int v : g[u]) {
      self(self, v, k);
    }
    if (sz[u] >= k / 2) {
      int max1 = 0, max2 = 0;
      for (int v : g[u]) {
        if (dp[v] >= max1) {
          max2 = max1;
          max1 = dp[v];
        } else if (dp[v] > max2) {
          max2 = dp[v];
        }
      }
      if (max2 > 0) {
        answer = std::max(answer, max1 + max2 + 1);
      }
      dp[u] = 1 + max1;
    }
    if (n - sz[u] >= k / 2) {
      answer = std::max(answer, 1 + dp[u]);
    }
  };

  dfs0(dfs0, 0, -1);

  for (int k = 1; k <= n; k++) {
    if (k % 2 == 1) {
      std::cout << 1 << ' ';
      continue;
    }
    answer = 1;
    dfs(dfs, 0, k);
    std::cout << answer << ' ';
  }

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...