Submission #907524

#TimeUsernameProblemLanguageResultExecution timeMemory
907524boxMeetings 2 (JOI21_meetings2)C++17
100 / 100
348 ms47696 KiB
#include <bits/stdc++.h> using namespace std; #ifndef LOCAL #define cerr if (0) cerr #endif typedef vector<int> vi; const int MAXN = 2e5, MAXL = 18; int N, sz[MAXN]; vi adj[MAXN], who[MAXN+1]; int depth[MAXN], jmp[MAXN][MAXL]; int ans[MAXN+1]; void make_sz(int p, int i) { sz[i] = 1; for (int j : adj[i]) if (p != j) { make_sz(i, j); sz[i] += sz[j]; } } void dfs(int i) { for (int l = 1; l < MAXL; l++) jmp[i][l] = jmp[jmp[i][l-1]][l-1]; sz[i] = 1; for (int j : adj[i]) if (jmp[i][0]^j) { jmp[j][0] = i; depth[j] = depth[i]+1; dfs(j); sz[i] += sz[j]; } who[sz[i]].push_back(i); } int lca(int i, int j) { if (depth[i] < depth[j]) swap(i, j); int d = depth[i]-depth[j]; for (int l = 0; l < MAXL; l++) if (d>>l&1) i = jmp[i][l]; if (i == j) return i; for (int l = MAXL-1; l >= 0; l--) if (jmp[i][l]^jmp[j][l]) i = jmp[i][l], j = jmp[j][l]; return jmp[i][0]; } int dist(int i, int j) { return depth[i]+depth[j]-2*depth[lca(i, j)]; } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N; for (int i = 0; i < N-1; i++) { int x, y; cin >> x >> y, x--, y--; adj[x].push_back(y); adj[y].push_back(x); } int c = [&]() { make_sz(-1, 0); int i = 0; while (1) { int c = -1; for (int j : adj[i]) if (sz[j] < sz[i] && sz[j]*2 > N) c = j; if (c == -1) break; i = c; } return i; }(); cerr << "GOT c=" << c+1 << endl; jmp[c][0] = c; dfs(c); int d = 0, x = c, y = c; for (int s = N/2; s >= 1; s--) { for (int i : who[s]) { int a = dist(x, i), b = dist(y, i); if (a < b) swap(a, b), swap(x, y); if (a > d) d = a, y = i; } ans[s*2] = d; } for (int k = 1; k <= N; k++) cout << ans[k]+1 << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...