제출 #1342217

#제출 시각아이디문제언어결과실행 시간메모리
1342217wangzhiyi33Meetings 2 (JOI21_meetings2)C++20
100 / 100
342 ms45892 KiB
#include<bits/stdc++.h>
using namespace std;
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
#pragma GCC optimize("O3,unroll-loops")

const int maxn=2e5;
int n;
vector<int>adj[maxn+2];
int sub[maxn+2];
int dep[maxn+2],bin[maxn+2][20];
vector<int>isi[maxn+2];

void dfs(int cur,int par){
    sub[cur]=1; dep[cur]=dep[par]+1;
    bin[cur][0]=par;
    for(auto x : adj[cur]){
        if(x==par)continue;
        dfs(x,cur);
        sub[cur]+=sub[x];
    }
    isi[sub[cur]].push_back(cur);
}

ii apa={1e9,1e9};

int centro(int cur,int par,int sz){
    int mx=0;
    for(auto x : adj[cur]){
        if(x==par)continue;
        centro(x,cur,sz);
        mx=max(mx,sub[x]);
    }
    mx=max(mx,sz-sub[cur]);
    if(apa.first>mx){
        apa.first=mx,apa.second=cur;
    }
    return cur;
}

int lca(int u,int v){
    if(dep[u]<dep[v])swap(u,v);

    int slsh=dep[u]-dep[v];
    for(int q=19;q>=0;q--){
        if((slsh>>q)&1){
            u=bin[u][q];
        }
    }
    if(u==v)return u;

    for(int q=19;q>=0;q--){
        if(bin[u][q]!=bin[v][q]){
            u=bin[u][q],v=bin[v][q];
        }
    }
    return bin[u][0];
}

int dist(int u,int v){
    return dep[u]+dep[v]-2*dep[lca(u,v)];
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int q=1;q<n;q++){
        int u,v;
        cin>>u>>v;
        adj[u].push_back(v); adj[v].push_back(u);
    }

    dfs(1,0);
    apa={1e9,1e9};

    centro(1,0,n);
    int root=apa.second;
    
    for(int q=0;q<=n;q++)isi[q].clear();

    dfs(root,0);
    for(int q=1;q<20;q++){
        for(int w=1;w<=n;w++){
            bin[w][q]=bin[bin[w][q-1]][q-1];
        }
    }

    int l=root,r=root;
    int ans[n+1];
    int mx=1;
   // cout<<root<<endl;
    for(int q=n/2;q>=1;q--){
        for(auto x : isi[q]){
            int a=dist(l,x)+1,b=dist(r,x)+1;
            if(a<b){
                if(mx<b){
                    mx=b; l=x;
                }
            }
            else{
                if(mx<a){
                    mx=a,r=x;
                }
            }
        }
        ans[q]=mx;
    }

    for(int q=1;q<=n;q++){
        if(q%2==1){
            cout<<1<<endl;
        }
        else{
            cout<<ans[q/2]<<endl;
        }
    }

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...