Submission #1236825

#TimeUsernameProblemLanguageResultExecution timeMemory
1236825hamanp87Meetings 2 (JOI21_meetings2)C++17
100 / 100
313 ms24060 KiB
#include<bits/stdc++.h>
using namespace std;

//#pragma GCC optimize("03,unroll-loops")
//#pragma GCC target("avx2")
//#pragma GCC target("sse4")

#define all(v) v.begin(),v.end()
#define F first
#define S second
#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
//#define randi uniform_int_distribution<long long>
#define damoon(v) v.resize(unique(all(v))-v.begin())
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//randi dist(0,10000000000000000);

typedef pair<int,int> pii;
typedef pair<long long,long long> pll;
typedef pair<int,bool> pib;
typedef pair<long long,bool> plb;
typedef pair<int,pii> pip;
typedef pair<pii,int> ppi;
typedef vector<int> veci;
typedef vector<long long> vecl;
typedef vector<bool> vecb;
typedef vector<pii> vecp;
typedef set<int> seti;
typedef set<long long> setl;
typedef set<pii> setp;
typedef map<int,int> mapii;
typedef map<long long,long long> mapll;
typedef map<int,bool> mapib;
typedef map<long long,bool> maplb;

const int inf=1e9,mod=1e9+7,neginf=-1e9,N=2e5+5;
const double PI=acos(-1);
int n,a[N],b[N],siz[N],mark[N],ans[N];
veci adj[N];

void dfs1(int u,int p,int s,int &c)
{
    siz[u]=1;
    for(int v:adj[u])
    {
        if(v==p or mark[v])
            continue;
        dfs1(v,u,s,c);
        siz[u]+=siz[v];
    }
    if(siz[u]>=s and (c==0 or siz[u]<siz[c]))
        c=u;
}

void dfs2(int u,int p,int hg)
{
    a[siz[u]]=max(a[siz[u]],hg);
    for(int v:adj[u])
    {
        if(v==p or mark[v])
            continue;
        dfs2(v,u,hg+1);
    }
}

void Solve(int rot,int n1)
{
    if(n1==1)
        return;

    int c=0;
    dfs1(rot,rot,(n1+1)/2,c);
    int d=0;
    dfs1(c,c,0,d);
    mark[c]=1;

    for(int i=1;i<=n1;i++)
        b[i]=-N;

    for(int v:adj[c])
    {
        if(mark[v])
            continue;
        for(int i=1;i<=siz[v];i++)
            a[i]=-N;
        dfs2(v,c,1);

        for(int i=siz[v]-1;i>0;i--)
            a[i]=max(a[i],a[i+1]);

        for(int i=1;i<=siz[v];i++)
        {
            ans[i]=max(ans[i],a[i]+b[i]+1);
            b[i]=max(a[i],b[i]);
            if(i<=n1-siz[v])
                ans[i]=max(ans[i],b[i]+1);
        }
    }

    for(int v:adj[c])
    {
        if(mark[v])
            continue;
        Solve(v,siz[v]);
    }
}

void solve()
{
    cin>>n;
    for(int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        adj[u].pub(v);
        adj[v].pub(u);
    }

    Solve(1,n);

    for(int i=1;i<=n;i++)
    {
        if(i&1)
            cout<<"1\n";
        else
            cout<<max(ans[i/2],1)<<"\n";
    }
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(false);

    //ifstream fin("in.txt");
    //ofstream fout("out.txt");

    int t=1;
    //cin>>t;
    while(t--)
    {
        solve();
    }
}

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