炒鸡可爱小萌新求条简单题目
查看原帖
炒鸡可爱小萌新求条简单题目
774854
qzmoot楼主2024/7/31 19:31

rt,只是根号分治而已,不是很难的拉,帮人家看看吧,样例二过不了,dfs用的是贪心,从叶子节点往上贪心找链

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=1e5+5;
int n,len,book[N],ans[N],las,siz[N];
vector<int>a[N];
int f[N];
void pre(int u,int fa)
{
	siz[u]=1;
	for(auto v:a[u])
	{
		if(v==fa)
			continue;
		f[v]=u;
		pre(v,u);
		siz[u]+=siz[v];
	}
}
int solve(int k)
{
	memset(book,0,sizeof book);
	int res=0;
	for(int i=1;i<=n;i++)
	{
		if(siz[i]==1)
		{
			int now=i,cnt=1;
			book[now]=1;
			while(now)
			{
				if(cnt==k)
					cnt=0,res++;
				now=f[now];
				if(book[now])
					break;
				book[now]=1;
				cnt++;
			}
		}
	}
	return res;
}
int main()
{
	scanf("%d",&n);
	len=sqrt(n);
	for(int i=1,u,v;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		a[u].pb(v),a[v].pb(u);
	}
	pre(1,0);
	for(int i=1;i<=len;i++)
		printf("%d\n",solve(i));
	las=n;
	for(int i=0;i<=n/len;i++)
	{
		int l=len+1,r=las,id=-1;
		while(l<=r)
		{
			int mid=l+r>>1;
			int ret=solve(mid);
			if(ret==i)
				r=mid-1,id=mid;
			else if(ret>i)
				l=mid+1;
			else
				r=mid-1;
		}
		if(id==-1)
			continue;
		for(int j=id;j<=las;j++)
			ans[j]=i;
		las=id-1;
	}
	for(int i=len+1;i<=n;i++)
		printf("%d\n",ans[i]);
	return 0;
}
2024/7/31 19:31
加载中...