CF1039D You are given a tree


#include 
const int N=100005;
int edge,last[N],dp[N],ans[N],cnt,n,x,y,Ans,dfn[N],idn,f[N];
struct Edge{
	int to,Next;
}e[N<<1];
void add(int x,int y){
	e[++edge]={y,last[x]};
	last[x]=edge;
}
void dfs(int x,int y){
	dfn[++idn]=x,f[x]=y;
	for (int i=last[x];i;i=e[i].Next){
		int u=e[i].to;
		if (u==y) continue;
		dfs(u,x);
	}
}
int cal(int k){
	int cnt=0;
	for (int i=1;i<=n;i++) dp[i]=1;
	for (int i=n;i>=1;i--){
		int x=dfn[i],ff=f[x];
		if (!dp[x]) continue;
		if (!dp[ff]) continue;
		if (dp[ff] && dp[ff]+dp[x]>=k){
			cnt++;
			dp[ff]=0;
		}else dp[ff]=std::max(dp[ff],dp[x]+1);
	}
	return cnt;
}
int main(){
	scanf("%d",&n);
	for (int i=1;i>1;
			if (cal(mid)==k) Ans=mid,l=mid+1;
			else r=mid-1;
		}
		for (int j=i;j<=Ans;j++) ans[j]=k; 
	}
	for (int i=1;i<=n;i++) printf("%d\n",ans[i]);
}