与题解对拍15000组,48分,求条!
查看原帖
与题解对拍15000组,48分,求条!
1585174
_cout_楼主2025/7/24 16:28
#include <bits/stdc++.h>
using namespace std;
int son[1000005],z[1000005],cnt[1000005],sum[1000005],id[1000005],res,vis[1000005];
vector <int> mp[1000005];
void dfs(int u,int fa)
{
	if(z[u]==0)
		son[u]=son[fa]-1;
	else
		son[u]=z[u];
	for(int i=0;i<mp[u].size();i++)
	{
		int v=mp[u][i];
		if(v==fa)
			continue;
		dfs(v,u);
	}
}
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n,s;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int v;
		cin>>v>>z[i];
		vis[z[i]]=1;
		if(z[i])
			res++;
		if(v==i)
		{
			s=i;
		} 
		else
		{
			mp[i].push_back(v);
			mp[v].push_back(i);
		}
		
	}
	z[s]=n;
	vis[n]=1;
	dfs(s,0);
	for(int i=1;i<=n;i++)
	{
		cnt[son[i]]++;
		id[son[i]]=i;
		//cout<<cnt[i]<<endl;
	}
	for(int i=1;i<=n;i++)
	{
		sum[i]=sum[i-1]+cnt[i];
		if(sum[i]==i && sum[i-1]==i-1 && vis[i]==0)
		{
			if(!z[id[i]])
			{
				res++;
			}
			vis[i]=1;
			z[id[i]]=i;
			
			
		}
		//cout<<sum[i]<<endl;
	}
	if(res==n-1)
	{
		int x;
		for(int i=1;i<=n;i++)
			if(vis[i]==0)
			{
				x=i;
				continue;
			}
		for(int i=1;i<=n;i++)
		{
			if(z[i]==0)
				z[i]=x;
		}
	}
	for(int i=1;i<=n;i++)
		cout<<z[i]<<"\n";
} 

2025/7/24 16:28
加载中...