Submission #1294693

#TimeUsernameProblemLanguageResultExecution timeMemory
1294693vivkostovMeetings 2 (JOI21_meetings2)C++20
0 / 100
4 ms580 KiB
#include<bits/stdc++.h>
using namespace std;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
int n,a[200005],b[200005],used[200005],lead,bot,path[200005],p[200005],otg[200005],mid,use[200005],ind[200005],mid1,mid2;
vector<int>v[200005],dp[200005];
void bfs(int beg)
{
    used[beg]=1;
    int w,nb;
    queue<int>q;
    q.push(beg);
    while(q.size())
    {
        w=q.front();
        q.pop();
        for(int i=0;i<v[w].size();i++)
        {
            nb=v[w][i];
            if(!used[nb])
            {
                q.push(nb);
                used[nb]=used[w]+1;
            }
        }
    }
}
void clea(int beg,int par)
{
    used[beg]=0;
    int w;
    for(int i=0;i<v[beg].size();i++)
    {
        w=v[beg][i];
        if(w==par)continue;
        clea(w,beg);
    }
}
void prec()
{
    int to=bot,nex,par=0;
    while(to!=lead)
    {
        for(int i=0;i<v[to].size();i++)
        {
            if(v[to][i]==par)continue;
            if(used[v[to][i]]!=used[to]-1)
            {
                clea(v[to][i],to);
            }
            else nex=v[to][i];
        }
        par=to;
        to=nex;
    }
}
void calc(int beg,int lead,int par)
{
    int w;
    p[lead]++;
    for(int i=0;i<v[beg].size();i++)
    {
        w=v[beg][i];
        if(!used[w]&&w!=par)
        {
            calc(w,lead,beg);
        }
    }
}
int check(int mi)
{
    int br=0;
    for(int i=1;i<=n;i++)
    {
        if(used[i]&&used[i]<=mi)br+=p[i];
    }
    return br;
}
void find_mid()
{
    int l=1,r=used[bot],mi;
    while(l<=r)
    {
        mi=(l+r)/2;
        //cout<<check(mi)<<" "<<l<<" "<<r<<endl;
        if(check(mi)>=(n+1)/2)r=mi-1;
        else l=mi+1;
    }
    if(min(check(l),n-check(l))>=min(check(l-1),n-check(l-1)))
    {
        mid1=l;
        mid2=l+1;
    }
    else
    {
        mid1=l-1;
        mid2=l;
    }
    for(int i=1;i<=n;i++)
    {
        if(used[i]==mid1)
        {
            mid1=i;
            break;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(used[i]==mid2)
        {
            mid2=i;
            break;
        }
    }
}
void get_dp(int beg,int par,int level)
{
    int w;
    //cout<<beg<<" "<<par<<endl;
    if(v[beg].size()==1)
    {
        ind[beg]=beg;
        dp[beg].push_back(level);
        return;
    }
    for(int i=0;i<v[beg].size();i++)
    {
        w=v[beg][i];
        if(w==par)continue;

        get_dp(w,beg,level+1);
        if(dp[ind[beg]].size()<dp[ind[w]].size())
        {
            ind[beg]=ind[w];
        }
    }
    int sum=1;
    for(int i=0;i<v[beg].size();i++)
    {
        w=v[beg][i];
        if(w==par||ind[w]==ind[beg])continue;
        sum+=dp[ind[w]].size();
        for(int j=0;j<dp[ind[w]].size();j++)
        {
            otg[j]=max(otg[j],dp[ind[beg]][j]+dp[ind[w]][j]-level*2+1);
            dp[ind[beg]][j]=max(dp[ind[beg]][j],dp[ind[w]][j]);
        }
    }
    for(int i=1;i<=sum;i++)
    {
        dp[ind[beg]].push_back(level);
    }
}
void read()
{
    cin>>n;
    for(int i=1;i<n;i++)
    {
        cin>>a[i]>>b[i];
        v[a[i]].push_back(b[i]);
        v[b[i]].push_back(a[i]);
    }
    cout<<endl<<endl;
    bfs(1);
    int ma=0;
    for(int i=1;i<=n;i++)
    {
        if(ma<used[i])
        {
            ma=used[i];
            lead=i;
        }
        used[i]=0;
    }
    bfs(lead);
    ma=0;
    for(int i=1;i<=n;i++)
    {
        if(ma<used[i])
        {
            ma=used[i];
            bot=i;
        }
    }
    prec();
    for(int i=1;i<=n;i++)
    {
        if(used[i])calc(i,i,0);
    }
    find_mid();
    get_dp(mid1,mid2,1);
    get_dp(mid2,mid1,1);
    /*cout<<lead<<" "<<bot<<endl;
    cout<<mid1<<" "<<mid2<<endl;
    for(int i=1;i<=n;i++)
    {
        cout<<ind[i]<<endl;
        cout<<i<<" : ";
        for(int j=0;j<dp[ind[i]].size();j++)
        {
            cout<<dp[ind[i]][j]<<" ";
        }
        cout<<endl;
    }*/
    /*cout<<mid1<<" "<<mid2<<endl;
    for(int i=0;i<=n;i++)
    {
        cout<<otg[i]<<" ";
    }
    cout<<endl;*/
    for(int i=1;i<=n;i++)
    {
        if(i%2==1)cout<<1<<" ";
        else
        {
            //cout<<min(dp[ind[mid1]].size(),dp[ind[mid2]].size())<<" "<<n/2-1<<endl;
            if(min(dp[ind[mid1]].size(),dp[ind[mid2]].size())>i/2-1)cout<<max(dp[ind[mid1]][i/2-1]+dp[ind[mid2]][i/2-1],otg[i/2-1])<<" ";
            else cout<<max(1,otg[i/2-1])<<" ";
        }
    }
    cout<<endl;
}
int main()
{
    speed();
    read();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...