1 条题解

  • 0
    @ 2026-5-5 16:26:31
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e5+5;
    int n,g1[N],g2[N],st[N],fa[N];
    vector<int>e[N];
    void dfs(int x,int p) {
    	st[++st[0]]=x,fa[x]=p;
    	for(int y:e[x])if(y!=p)dfs(y,x);
    }
    int sol(int k) {
    	int ans=0;
    	for(int i=1;i<=n;i++)g1[i]=g2[i]=0;
    	for(int i=n;i;i--) {
    		int x=st[i],p=fa[x];
    		if(g1[x]+g2[x]+1>=k)ans++,g1[x]=-1;
    		if(g1[x]+1>g1[p])g2[p]=g1[p],g1[p]=g1[x]+1;
    		else g2[p]=max(g2[p],g1[x]+1);
    	}
    	return ans;
    }
    int main() {
    	scanf("%d",&n);
    	for(int i=1,x,y;i<n;i++)scanf("%d%d",&x,&y),e[x].push_back(y),e[y].push_back(x);
    	dfs(1,0);
    	for(int i=1;i<=n;) {
    		int now=sol(i),l=i,r=n,mid,res;
    		while(l<=r)mid=l+r>>1,(sol(mid)==now?l=mid+1,res=mid:r=mid-1);
    		while(i<=res)printf("%d\n",now),i++;
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    6847
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者