제출 #1146822

#제출 시각아이디문제언어결과실행 시간메모리
1146822ace5Meetings 2 (JOI21_meetings2)C++20
100 / 100
225 ms56420 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 200005; const int maxlog = 20; vector<int> g[maxn]; vector<int> per[maxn]; int binup[maxlog][maxn]; int dep[maxn]; int sz[maxn]; int mx[maxn]; int ans[maxn]; int vv[maxn]; int p[maxn]; int n; void dfs_sz(int v,int p) { sz[v] = 1; for(auto u:g[v]) { if(u != p) { dfs_sz(u,v); sz[v] += sz[u]; } } return ; } void dfs(int v,int pp,int d) { dep[v] = d; p[v] = pp; for(int j = 0;j < maxlog;++j) { binup[j][v] = (j == 0 ? (v == 0 ? 0 : p[v]) : binup[j-1][binup[j-1][v]]); } int vu = v; for(int j = maxlog-1;j >= 0;--j) { if(n-sz[binup[j][vu]] >= sz[v]) { vu = binup[j][vu]; } } vu = p[vu]; if(2*sz[v] > n) { vu = v; } mx[sz[v]] = max(mx[sz[v]],(d-dep[vu]+1)); vv[vu] = max(vv[vu],d); for(auto u:g[v]) { if(u != pp) dfs(u,v,d+1); } return ; } int dfs2(int v,int p) { int tvv = vv[v]; for(auto u:g[v]) { if(u != p) { tvv = max(tvv,dfs2(u,v)); } } // cout << n-sz[v]+1 << ' ' << v << ' ' << tvv-dep[v]+1 << endl; mx[n-sz[v]] = max(mx[n-sz[v]],tvv-dep[v]+2); return tvv; } int dfs_ans(int v,int p) { vector<int> ind; for(auto u:g[v]) { if(u != p) { ind.push_back(dfs_ans(u,v)); if(per[ind.back()].size() > per[ind[0]].size()) swap(ind.back(),ind[0]); } } if(ind.size() == 0) { vector<int> xx = {dep[v]}; per[v] = xx; return v; } else { for(int i = 1;i < ind.size();++i) { for(int j = 0;j < per[ind[i]].size();++j) { ans[j+1] = max(ans[j+1],per[ind[i]][j] + per[ind[0]][j] - 2*dep[v] + 1); per[ind[0]][j] = max(per[ind[0]][j],per[ind[i]][j]); } } int y = per[ind[0]].size(); for(int u = 0;u < sz[v]-y;++u) { per[ind[0]].push_back(dep[v]); } return ind[0]; } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n; for(int j = 0;j < n-1;++j) { int u,v; cin >> u >> v; u--; v--; g[u].push_back(v); g[v].push_back(u); } dfs_sz(0,-1); dfs(0,-1,0); dfs2(0,-1); dfs_ans(0,-1); int tmx = 0; for(int j = n;j >= 0;--j) { tmx = max(tmx,mx[j+1]); ans[j+1] = max(ans[j+1],tmx); } for(int j = 0;j < n;++j) { cout << (j%2 == 0 ? 1 : ans[j/2+1]) << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...