Submission #630605

#TimeUsernameProblemLanguageResultExecution timeMemory
630605valerikkMeetings 2 (JOI21_meetings2)C++17
100 / 100
866 ms33420 KiB
#include <bits/stdc++.h> using namespace std; #define x first #define y second #define all(a) begin(a), end(a) #define sz(a) ((int) (a).size()) using ll = long long; const int N = 200005; int n; vector<int> g[N]; int init_sz[N], init_d[N]; bool used[N]; int sz[N], d[N]; int ans[N], first[N]; void upd_ans(int x, int y) { ans[2 * x] = max(ans[2 * x], y); } void dfs_prepare(int u = 0, int p = -1, int cd = 0) { init_sz[u] = 1; init_d[u] = cd; for (int v : g[u]) { if (v != p) { dfs_prepare(v, u, cd + 1); init_sz[u] += init_sz[v]; } } } int get_subtree_sz(int u, int v) { return init_d[u] < init_d[v] ? init_sz[v] : n - init_sz[u]; } void dfs(int u, int p = -1, int cd = 0) { sz[u] = 1; d[u] = cd; for (int v : g[u]) { if (!used[v] && v != p) { dfs(v, u, cd + 1); sz[u] += sz[v]; } } } int centr(int all_sz, int u, int p = -1) { for (int v : g[u]) { if (!used[v] && v != p && 2 * sz[v] > all_sz) { return centr(all_sz, v, u); } } return u; } void dfs_ans(int root, vector<pair<int, int>> &vs, int u, int p = -1) { if (u != root) { first[u] = p == root ? u : first[p]; vs.push_back({get_subtree_sz(p, u), u}); upd_ans(min(get_subtree_sz(p, u), get_subtree_sz(first[u], root)), d[u] + 1); } for (int v : g[u]) { if (!used[v] && v != p) { dfs_ans(root, vs, v, u); } } } void solve(int root) { dfs(root); vector<pair<int, int>> vs; dfs_ans(root, vs, root); sort(all(vs)); reverse(all(vs)); vector<pair<int, int>> cur; for (auto [s, v] : vs) { for (auto [du, fu] : cur) { if (fu != first[v]) { upd_ans(s, du + d[v] + 1); } } cur.push_back({d[v], first[v]}); sort(all(cur)); bool cont = true; for (int i = 0; i < sz(cur) && cont; ++i) { for (int j = i + 1; j < sz(cur) && cont; ++j) { if (cur[i].y == cur[j].y) { cur.erase(begin(cur) + i); cont = false; } } } if (sz(cur) == 3) { cur.erase(begin(cur)); } } used[root] = true; for (int v : g[root]) { if (!used[v]) { solve(centr(sz[v], v)); } } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 0; i < n - 1; ++i) { int a, b; cin >> a >> b; --a, --b; g[a].push_back(b); g[b].push_back(a); } for (int i = 1; i <= n; ++i) { ans[i] = 1; } dfs_prepare(); dfs(0); solve(centr(n, 0)); for (int i = n; i >= 2; --i) { ans[i - 2] = max(ans[i - 2], ans[i]); } for (int i = 1; i <= n; ++i) { cout << ans[i] << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...