Submission #1215354

#TimeUsernameProblemLanguageResultExecution timeMemory
1215354duckindogMeetings 2 (JOI21_meetings2)C++20
0 / 100
2 ms4936 KiB
#include <bits/stdc++.h> using namespace std; const int N = 200'000 + 10; int n; vector<int> ad[N]; int sz[N], totalSz; int depth[N]; void dfs(int u, int p = -1) { sz[u] = 1; for (const auto& v : ad[u]) { if (v == p) continue; depth[v] = depth[u] + 1; dfs(v, u); sz[u] += sz[v]; } totalSz = sz[u]; } int centroid(int u, int p = -1) { for (const auto& v : ad[u]) { if (v == p) continue; if (sz[v] > totalSz / 2) return centroid(v, u); } return u; } namespace IT { int f[N << 2]; void update(int s, int l, int r, int p, int x) { if (l == r) { f[s] = max(f[s], x); return; } int mid = (l + r) >> 1; if (p <= mid) update(s << 1, l, mid, p, x); else update(s << 1 | 1, mid + 1, r, p, x); f[s] = max(f[s << 1], f[s << 1 | 1]); } int query(int s, int l, int r, int u, int v) { if (v < l || u > r) return 0; if (u <= l && r <= v) return f[s]; int mid = (l + r) >> 1; return max(query(s << 1, l, mid, u, v), query(s << 1 | 1, mid + 1, r, u, v)); } } int id[N]; void idDFS(int u, int p = -1) { for (const auto& v : ad[u]) { if (v == p) continue; id[v] = id[u]; idDFS(v, u); } } int answer[N]; int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> n; for (int i = 1; i < n; ++i) { int u, v; cin >> u >> v; ad[u].push_back(v); ad[v].push_back(u); } int root = 1; dfs(root); root = centroid(root); depth[root] = 0; dfs(root); for (int i = 0; i < (int)ad[root].size(); ++i) { int u = ad[root][i]; id[u] = i + 1; idDFS(u, root); } vector<int> order(n); iota(order.begin(), order.end(), 1); sort(order.begin(), order.end(), [&](int x, int y) { return sz[x] > sz[y]; }); answer[n] = 1; for (const auto& u : order) { if (u == root) continue; IT::update(1, 1, n, id[u], depth[u]); int dis = max(IT::query(1, 1, n, 1, id[u] - 1), IT::query(1, 1, n, id[u] + 1, n)) + depth[u] + 1; answer[sz[u] * 2] = max(answer[sz[u] * 2], dis); } for (int i = n - 1; i >= 1; --i) { answer[i] = max(answer[i], answer[i + 1]); } for (int i = 1; i <= n; ++i) { cout << (i & 1 ? 1 : answer[i]) << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...