Submission #1293467

#TimeUsernameProblemLanguageResultExecution timeMemory
1293467IcelastMeetings 2 (JOI21_meetings2)C++20
100 / 100
679 ms31976 KiB
#include <iostream> #include <bits/stdc++.h> #define ll long long using namespace std; const ll maxn = 2*1e5+5, INF = 4e18+9; template <class T> struct Fenwick { int n, log; vector<T> bit; Fenwick(int n) : n(n), log(32 - __builtin_clz(n + 1)), bit(n + 1, 0) {} void add(int i, T delta) { for (; i <= n; i += i & -i) { bit[i] = max(bit[i], delta); } } T sum(int i) { T res = 0; for (; i > 0; i -= i & -i) { res = max(res, bit[i]); } return res; } }; vector<int> res; struct CentroidTree{ int n; vector<int> pa; CentroidTree(int n, vector<vector<int>> &adj) : n(n){ pa.resize(n+1, -1); vector<bool> ban(n+1, false); vector<int> sub(n+1), sub2(n+1); int tree_size; auto rt = [&](auto rt, int u, int p) -> void{ sub[u] = 1; for(int v : adj[u]){ if(v == p || ban[v]) continue; rt(rt, v, u); sub[u]+=sub[v]; } }; auto find = [&](auto find, int u, int p) -> int{ for(int v : adj[u]){ if(v == p || ban[v]) continue; if(sub[v]*2 > tree_size){ return find(find, v, u); } } return u; }; auto build = [&](auto build, int u, int p) -> void{ rt(rt, u, u); tree_size = sub[u]; int c = find(find, u, u); ban[c] = true; pa[c] = p; Fenwick<int> bit(tree_size); vector<pair<int, int>> to_del, vv; auto dfs = [&](auto dfs, int u, int p, int len) -> void{ sub2[u] = 1; for(int v : adj[u]){ if(v == p || ban[v]) continue; dfs(dfs, v, u, len+1); sub2[u] += sub2[v]; } vv.push_back({tree_size+1 - sub2[u], len}); int mx = bit.sum(tree_size+1 - sub2[u]); if(mx > 0) res[sub2[u]*2] = max(res[sub2[u]*2], mx+len+1); }; for(int v : adj[c]){ if(ban[v]) continue; vv.clear(); dfs(dfs, v, c, 1); int szA = tree_size - sub2[v]; for(auto it : vv){ bit.add(it.first, it.second); int sz = tree_size+1 - it.first; int mn = min(sz, szA); res[mn*2] = max(res[mn*2], it.second+1); } } for(int i = 1; i <= tree_size; i++){ bit.bit[i] = 0; } for(int i = adj[c].size()-1; i >= 0; i--){ int v = adj[c][i]; if(ban[v]) continue; vv.clear(); dfs(dfs, v, c, 1); for(auto it : vv){ bit.add(it.first, it.second); } } for(int v : adj[c]){ if(ban[v]) continue; build(build, v, c); } }; build(build, 1, 0); }; }; void solve(){ int n; cin >> n; vector<vector<int>> adj(n+1); for(int i = 1; i < n; i++){ int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } res.resize(n+1, 0); CentroidTree(n, adj); vector<int> ans(n+1); int mx = 1; for(int i = n; i >= 1; i--){ mx = max(mx, res[i]); if(i&1){ ans[i] = 1; continue; } ans[i] = mx; } for(int i = 1; i <= n; i++){ cout << ans[i] << "\n"; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...