제출 #386296

#제출 시각아이디문제언어결과실행 시간메모리
386296kshitij_sodaniMeetings 2 (JOI21_meetings2)C++14
100 / 100
1566 ms84324 KiB
//#pragma GCC optimize("Ofast,unroll-loops") #include <bits/stdc++.h> using namespace std; typedef long long llo; #define mp make_pair #define pb push_back #define a first #define b second #define endl '\n' llo n; llo aa,bb; vector<llo> adj[2000001]; llo cur=-1; llo ma[200001]; llo ne[200001]; llo ss[200001]; llo cot=0; llo pre[200001]; llo vis[200001]; llo lev[200001]; vector<pair<llo,llo>> tt; void dfs2(llo no,llo par2=-1,llo cot2=-1,llo levv=0){ ss[no]=1; ne[no]=cot2; lev[no]=levv; for(auto j:adj[no]){ if(vis[j]){ continue; } if(j!=par2){ if(par2==-1){ cot2=j; } dfs2(j,no,cot2,levv+1); ss[no]+=ss[j]; } } if(par2!=-1){ tt.pb({ss[no],no}); } } llo pp; llo find(llo no,llo par2=-1){ for(auto j:adj[no]){ if(vis[j]){ continue; } if(ss[j]>(pp/2) and j!=par2){ return find(j,no); } } return no; } void dec(llo no){ dfs2(no,-1,no); pp=ss[no]; no=find(no); tt.clear(); dfs2(no); sort(tt.begin(),tt.end()); reverse(tt.begin(),tt.end()); //ma[no]=0; set<pair<llo,llo>> xx; //xx.insert({0,no}); for(auto j:adj[no]){ if(vis[j]==0){ ma[j]=0; xx.insert({0,j}); } } for(auto j:tt){ xx.erase({-ma[ne[j.b]],ne[j.b]}); ma[ne[j.b]]=max(ma[ne[j.b]],lev[j.b]); if(xx.size()){ pair<llo,llo> cc=*(xx.begin()); /*if(j.a==1){ cout<<no<<":"< }*/ pre[j.a]=max(pre[j.a],lev[j.b]-cc.a+1); } llo yy=n-ss[ne[j.b]]; yy=min(yy,j.a); pre[yy]=max(pre[yy],lev[j.b]+1); xx.insert({-ma[ne[j.b]],ne[j.b]}); } vis[no]=1; for(auto j:adj[no]){ if(vis[j]==0){ //cout<<no<<":"<<j<<endl; dec(j); } } } /*void dfs3(llo no,llo par2=-1,llo lev=0){ if(par2!=-1){ pre[min(ss[no],n-ss[ne[no]])]=max(pre[min(ss[no],n-ss[ne[no]])],lev+1); } for(auto j:adj[no]){ if(j!=par2){ dfs3(j,no,lev+1); } } }*/ int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n; for(llo i=0;i<n-1;i++){ cin>>aa>>bb; aa--; bb--; adj[aa].pb(bb); adj[bb].pb(aa); } dec(0); /*for(llo i=0;i<n;i++){ dfs2(i); dfs3(i); }*/ for(llo j=n-1;j>=0;j--){ pre[j]=max(pre[j+1],pre[j]); } /* for(llo j=1;j<=n;j++){ cout<<pre[j]<<","; } cout<<endl;*/ for(llo j=1;j<=n;j++){ if(j%2==1){ cout<<1<<endl; } else{ llo ans=1; cout<<max(pre[j/2],ans)<<endl; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...