Submission #1344057

#TimeUsernameProblemLanguageResultExecution timeMemory
1344057avighnaMeetings 2 (JOI21_meetings2)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>

using namespace std;

int main() {
  cin.tie(nullptr)->sync_with_stdio(false);

  // fix a line
  // count #left, #right, take min, times 2

  int n;
  cin >> n;
  vector<vector<int>> adj(n + 1);
  for (int i = 0, u, v; i < n - 1; ++i) {
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }

  vector<int> par(n + 1), tin(n + 1), tout(n + 1), subtree_sz(n + 1);
  int timer = 0;
  auto dfs = [&](auto &&self, int u, int p) -> void {
    par[u] = p;
    tin[u] = timer++;
    subtree_sz[u] = 1;
    for (int &i : adj[u]) {
      if (i != p) {
        self(self, i, u);
        subtree_sz[u] += subtree_sz[i];
      }
    }
    tout[u] = timer - 1;
  };
  dfs(dfs, 1, 0);

  vector dist(n + 1, vector<int>(n + 1));
  auto sssp = [&](int u) {
    queue<int> q;
    vector<bool> vis(n + 1);
    q.push(u);
    vector<int> ans(n + 1, n);
    ans[u] = 0;
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      if (vis[u]) {
        continue;
      }
      vis[u] = true;
      for (int &i : adj[u]) {
        if (ans[u] + 1 < ans[i]) {
          ans[i] = ans[u] + 1;
          q.push(i);
        }
      }
    }
    return ans;
  };
  for (int i = 1; i <= n; ++i) {
    dist[i] = sssp(i);
  }

  vector<int> ans(2 * n + 1, 1);
  auto process_line = [&](int u, int v) {
    int d = dist[u][v];
    if (tin[u] > tin[v]) {
      swap(u, v);
    }
    if (tin[u] <= tin[v] && tin[v] <= tout[u]) {
      // go 1 down on u
      for (int &i : adj[u]) {
        if (i == par[u]) {
          continue;
        }
        if (tin[i] <= tin[v] && tin[v] <= tout[i]) {
          u = i;
          break;
        }
      }
      int size = min(subtree_sz[v], n - subtree_sz[u]);
      ans[2 * size] = max(ans[2 * size], d + 1);
    } else {
      int size = min(subtree_sz[u], subtree_sz[v]);
      ans[2 * size] = max(ans[2 * size], d + 1);
    }
  };
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j < i; ++j) {
      process_line(i, j);
    }
  }

  for (int i = 1; i <= n; ++i) {
    cout << ans[i] << '\n';
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...