Submission #926505

#TimeUsernameProblemLanguageResultExecution timeMemory
926505andrei_boacaMeetings 2 (JOI21_meetings2)C++17
100 / 100
1036 ms31428 KiB
#include <bits/stdc++.h>

using namespace std;
int n,sol[200005],par[200005],nr[200005],use[200005],reprez[200005],niv[200005];
vector<int> muchii[200005];
vector<int> nodes;
void dfs1(int nod)
{
    nr[nod]=1;
    for(int i:muchii[nod])
        if(!use[i]&&i!=par[nod])
        {
            par[i]=nod;
            dfs1(i);
            nr[nod]+=nr[i];
        }
}
void dfs(int nod)
{
    if(niv[nod]>=1)
        nodes.push_back(nod);
    nr[nod]=1;
    for(int i:muchii[nod])
        if(!use[i]&&i!=par[nod])
        {
            par[i]=nod;
            niv[i]=niv[nod]+1;
            if(niv[nod]==0)
                reprez[i]=i;
            else
                reprez[i]=reprez[nod];
            dfs(i);
            nr[nod]+=nr[i];
        }
}
int arb[4*200005];
void build(int nod,int st,int dr)
{
    arb[nod]=-1;
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    build(nod*2,st,mij);
    build(nod*2+1,mij+1,dr);
}
void update(int nod,int st,int dr,int poz,int val)
{
    if(st==dr)
    {
        arb[nod]=max(arb[nod],val);
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
        update(nod*2,st,mij,poz,val);
    else
        update(nod*2+1,mij+1,dr,poz,val);
    arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
int query(int nod,int st,int dr,int a,int b)
{
    if(st>=a&&dr<=b)
        return arb[nod];
    int mij=(st+dr)/2;
    int rez=-1;
    if(a<=mij)
        rez=max(rez,query(nod*2,st,mij,a,b));
    if(b>mij)
        rez=max(rez,query(nod*2+1,mij+1,dr,a,b));
    return rez;
}
int R;
void solve()
{
    build(1,1,nr[R]);
    for(int i=0;i<nodes.size();i++)
    {
        int j=i;
        while(j<nodes.size()&&reprez[nodes[j]]==reprez[nodes[i]])
            j++;
        j--;
        for(int k=i;k<=j;k++)
        {
            int x=nodes[k];
            int val=query(1,1,nr[R],nr[x],nr[R]);
            if(val!=-1)
                sol[2*nr[x]]=max(sol[2*nr[x]],val+niv[x]+1);
        }
        for(int k=i;k<=j;k++)
        {
            int x=nodes[k];
            update(1,1,nr[R],nr[x],niv[x]);
        }
        i=j;
    }
}
void centroid(int nod)
{
    par[nod]=0;
    dfs1(nod);
    int root=nod;
    int lg=nr[nod];
    while(true)
    {
        bool bad=0;
        for(int i:muchii[root])
            if(!use[i]&&par[i]==root&&i!=par[root]&&nr[i]>lg/2)
            {
                par[i]=0;
                par[root]=i;
                nr[root]-=nr[i];
                nr[i]+=nr[root];
                root=i;
                bad=1;
                break;
            }
        if(!bad)
            break;
    }
    R=root;
    nodes.clear();
    niv[root]=0;
    dfs(root);
    for(int i:nodes)
    {
        int x=nr[i];
        int y=nr[root]-nr[reprez[i]];
        int d=niv[i]+1;
        int poz=2*min(x,y);
        sol[poz]=max(sol[poz],d);
    }
    solve();
    reverse(nodes.begin(),nodes.end());
    solve();
    use[root]=1;
    for(int i:muchii[root])
        if(!use[i])
            centroid(i);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<n;i++)
    {
        int a,b;
        cin>>a>>b;
        muchii[a].push_back(b);
        muchii[b].push_back(a);
    }
    for(int i=1;i<=n;i++)
        sol[i]=1;
    centroid(1);
    for(int i=(n/2)*2;i>=2;i-=2)
        sol[i]=max(sol[i],sol[i+2]);
    for(int i=1;i<=n;i++)
        cout<<sol[i]<<'\n';
    return 0;
}

Compilation message (stderr)

meetings2.cpp: In function 'void solve()':
meetings2.cpp:76:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |     for(int i=0;i<nodes.size();i++)
      |                 ~^~~~~~~~~~~~~
meetings2.cpp:79:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   79 |         while(j<nodes.size()&&reprez[nodes[j]]==reprez[nodes[i]])
      |               ~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...