Submission #1273926

#TimeUsernameProblemLanguageResultExecution timeMemory
1273926uzukishinobuMeetings 2 (JOI21_meetings2)C++20
100 / 100
297 ms27032 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a;
vector <int> z[1000005];
int res[1000005];
int del[1000005];
int child[1000005];
int sz;
void predfs(int i,int par){
    child[i]=1;
    for (auto p:z[i]){
         if (p==par || del[p]){
             continue;
         }
         predfs(p,i);
         child[i]+=child[p];
    }
}
int centroid(int i,int par){
    for (auto p:z[i]){
         if (p==par || del[p]){
             continue;
         }
         if (child[p]*2>sz){
             return centroid(p,i);
         }
    }
    return i;
}
int pre[1000005];
int t[1000005];

void dfs(int i,int par,int depth){
    child[i]=1;
    for (auto p:z[i]){
         if (p==par || del[p]){
             continue;
         }
         dfs(p,i,depth+1);
         child[i]+=child[p];
    }
    pre[child[i]]=max(pre[child[i]],depth);
}
void decompose(int i){
     predfs(i,0);
     sz=child[i];
     int cen=centroid(i,0);
     del[cen]=1;
     for (int j=1;j<=sz;j++){
          pre[j]=0;
          t[j]=0;
     }
     for (auto p:z[cen]){
          if (del[p]){
              continue;
          }
          dfs(p,cen,1);
          for (int j=child[p]-1;j>=1;j--){
               pre[j]=max(pre[j],pre[j+1]);
          }
          for (int j=1;j<=child[p];j++){
               res[j*2]=max(res[j*2],pre[j]+t[j]);
               t[j]=max(t[j],pre[j]);
          }
          for (int j=1;j<=child[p];j++){
               pre[j]=0;
          }
          
     }
     for (auto p:z[cen]){
          if (del[p]){
              continue;
          }
          decompose(p);
     }
}
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a;
    for (int i=1;i<a;i++){
         int x,y;
         cin >> x >> y;
         z[x].push_back(y);
         z[y].push_back(x);
    }
    decompose(1);
    for (int i=1;i<=a;i++){
         if (i%2==0){
             cout << res[i]+1 << "\n";
         }else{
             cout << 1 << "\n";
         }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...