社区讨论

MnZn求hack

P13680 [IAMOI R2] 未送出的花参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjhxs2r
此快照首次捕获于
2025/11/04 02:51
4 个月前
此快照最后确认于
2025/11/04 02:51
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int T,n,dep[N],f[N][30],dp,tr[N],lg[N],l[N][N];
vector<int> v[N];
priority_queue<pair<int,int> > q;
int find(int i)
{
	return i & -i;
}
void dfs(int x,int deep,int fa)
{
	dep[x]=deep,f[x][0]=fa,dp=max(dp,deep);
	for(register int i=0;i<v[x].size();++i)
	{
		int to=v[x][i];
		if(to==fa) continue;
		dfs(to,deep+1,x);
	}
}
void serve(int now)
{
	if(now!=1)
	{
		int sd=dep[now]/2;
		int t=lg[sd],mid=now;
		while(sd>0)
		{
			if(sd>=(1<<t)) mid=f[mid][t],sd-=(1<<t);
			t--;
		}
		tr[mid]++;
	}
	for(register int i=0;i<v[now].size();++i)
	{
		int to=v[now][i];
		if(to==f[now][0]) continue;
		serve(to);
	}
}
void flower(int x)
{
	l[x][1]=tr[x];
	for(register int i=0;i<v[x].size();++i)
	{
		int to=v[x][i];
		if(to==f[x][0]) continue;
		flower(to);
		for(register int j=2;j<=n;++j)
			if(l[to][j-1]!=0) l[x][j]=max(l[x][j],l[to][j-1]+tr[x]);
	}
}
int main()
{
	cin>>T;
	for(register int i=2;i<=N;++i)
	{
		lg[i]=lg[i-1];
		if(i==find(i)) lg[i]++;
	}
	while(T--)
	{
		cin>>n;
		for(register int i=1;i<n;++i)
		{
			int x,y;
			cin>>x>>y;
			v[x].push_back(y);
			v[y].push_back(x);
		}
		dfs(1,1,0);
		for(register int i=1;(1<<i)<dp;++i)
			for(register int j=1;j<=n;++j)
				f[j][i]=f[f[j][i-1]][i-1];
		tr[1]++; serve(1); flower(1); 
		int num=n;
		for(register int i=1;i<=n;++i)
		{
			int st=l[1][i-1]+1;
			if(l[1][i]==0) l[1][i]=n;
			for(register int j=st;j<=l[1][i];++j) cout<<num<<" ";
			if(l[1][i]==n) break;
			num--;
		}
		cout<<endl;
		for(register int i=1;i<=n+1;++i) 
		{
			for(register int j=0;j<30;++j) f[i][j]=0;
			for(register int j=0;j<=n;++j) l[i][j]=0;
			dep[i]=0,tr[i]=0;
			v[i].clear();
		}
		dp=0;
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...