제출 #1286240

#제출 시각아이디문제언어결과실행 시간메모리
1286240denislavMeetings 2 (JOI21_meetings2)C++20
20 / 100
4091 ms31388 KiB
# include <iostream> # include <vector> using namespace std; template<class T> void chmax(T& x, const T& y) {x=max(x,y);} const int MAX=2e5+11,LOG=20; int n; vector<int> adj[MAX]; int out[MAX]; int SZ[MAX]; int H[MAX]; int st[MAX][LOG]; void dfs_lca(int curr, int par) { SZ[curr]=1; for(int nxt: adj[curr]) { if(nxt==par) continue; H[nxt]=H[curr]+1; st[nxt][0]=curr; dfs_lca(nxt,curr); SZ[curr]+=SZ[nxt]; } } void lca_precalc() { dfs_lca(1,0); for(int j=1;j<LOG;j++) { for(int i=1;i<=n;i++) { if(H[i]-(1<<j)<0) continue; st[i][j]=st[st[i][j-1]][j-1]; } } } int lift(int u, int k) { for(int j=LOG-1;j>=0;j--) { if(k-(1<<j)>=0) { u=st[u][j]; k-=(1<<j); } } return u; } int get_lca(int u, int v) { if(H[u]<H[v]) swap(u,v); for(int j=LOG-1;j>=0;j--) { if(H[u]-(1<<j)>=H[v]) { u=st[u][j]; } } if(u==v) return u; for(int j=LOG-1;j>=0;j--) { if(H[u]-(1<<j)>=0 and st[u][j]!=st[v][j]) { u=st[u][j]; v=st[v][j]; } } return st[u][0]; } pair<int,int> sizes(int u, int v) { int lca=get_lca(u,v); if(lca!=u and lca!=v) return {SZ[u],SZ[v]}; bool Swap=0; if(u!=lca) { Swap=1; swap(u,v); } pair<int,int> ans; ans={n-SZ[lift(v,H[v]-H[u]-1)],SZ[v]}; if(Swap) swap(ans.first,ans.second); return ans; } int sz[MAX]; int from[MAX]; int h[MAX]; void dfs(int curr, int par) { sz[curr]=1; for(int nxt: adj[curr]) { if(nxt==par) continue; if(from[curr]==0) from[nxt]=nxt; else from[nxt]=from[curr]; h[nxt]=h[curr]+1; dfs(nxt,curr); sz[curr]+=sz[nxt]; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<n;i++) { int u,v; cin>>u>>v; adj[u].push_back(v); adj[v].push_back(u); } lca_precalc(); for(int i=1;i<=n;i++) out[i]=1; for(int i=1;i<=n;i++) { h[i]=1; from[i]=0; dfs(i,0); for(int u=1;u<=n;u++) { if(u==i) continue; //chmax(out[2*min(sz[u],n-sz[from[u]])],h[u]); int sz1,sz2; tie(sz1,sz2)=sizes(u,i); chmax(out[2*min(sz1,sz2)],h[u]); } } int start=n; if(start%2==1) start--; for(int i=start-2;i>=2;i--) out[i]=max(out[i],out[i+2]); for(int i=1;i<=n;i++) cout<<out[i]<<"\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...