60分 ! 求调 ! 玄关 !
查看原帖
60分 ! 求调 ! 玄关 !
989997
DGL__DGL_AFO楼主2024/9/25 17:37

#5 #8 #10 比答案少1 #7 比答案多1

#include<bits/stdc++.h>
using namespace std;
int n;
int h[1145140],e[1145140],ne[1145140],idx;
int w[1145140][2];
int c[1145140],fa[1145140],p[1145140];
int q[1145140],l,r;
int cnt[1145140],rr[1145140];
int root,gen,dgl,ans,s;

inline void add(int a,int b)
{
	idx++;
	ne[idx]=h[a];
	e[idx]=b;
	h[a]=idx;
}

inline void bfs()
{
	for(int i=1;i<=n;i++)
	  if(!c[i])
	  	q[r++]=i; 
		else
		  p[i]=c[i];	   
	
	while(l<=r)
	{
		int x=q[l++];
		if(x)
		  cnt[x]=1;
		c[fa[x]]--;
		if(!c[fa[x]])
			q[r++]=fa[x];	  
	}
	
	/*for(int i=1;i<=n;i++)
	{
		cout<<rr[i]<<' '<<p[i]<<'\n';
	}*/
	  /*if(!rr[i]&&p[i])
	    cnt[i]=0;*/
	  //cout<<cnt[i]<<" ";	
}

inline void dfs(int x)
{
	cnt[x]=1;
  //cout<<x<<' ';
	int ff=0;
	int op=0,cnt=0,res=0;
	for(int i=h[x];i;i=ne[i])
	{
		int y=e[i];
		if(s!=y)
		{
			dfs(y);
			
			ff++;
			if(w[y][0]>=w[y][1])
			{
				w[x][0]+=w[y][0];
				op=1;
			}
			else
			{
				w[x][0]+=w[y][1];
				cnt=w[y][0];
				res=w[y][1];
			}
		}
	}
	if(ff)
	{
		w[x][1]=max(w[x][1],w[x][0]);
		if(!op)
		{
			w[x][1]-=res;
			w[x][1]+=cnt;
		}
		w[x][1]++;
	}
}

inline void find()
{
	for(int i=1;i<=n;i++)
	  if(!cnt[i])
	  {
	  	memset(w,0,sizeof w);
	  	dgl=0;
	  	root=fa[i];
	  	s=i;
	  	//cout<<root<<'\n';
	  	//cout<<"-----------------"<<'\n';
	  	dfs(i);
	  	//cout<<"\n-----------------"<<'\n';
	  	dgl=max(w[i][1],w[i][0]);
	  //	for(int j=1;j<=n;j++)
	  	  //cout<<j<<' '<<fa[j]<<' '<<w[j][0]<<' '<<w[j][1]<<'\n';
			memset(w,0,sizeof w);
			w[root][1]=1;
			w[root][0]=-1e9;
			dfs(i);
			//cout<<"\n-------------"<<'\n';
			/*for(int j=h[i];j;j=ne[j])
	  	{
	  		int y=e[j];
	  		if(y==fa[i])
	  		  ress+=w[y][0];
				else
				  ress+=max(w[y][1],w[y][0]);
			}*/
			dgl=max(dgl,w[i][0]);
			//for(int j=1;j<=n;j++)
	  	 // cout<<j<<' '<<fa[j]<<' '<<w[j][0]<<' '<<w[j][1]<<'\n';
			//add(i,++gen);
	  	//dfs(i);
	  	ans+=dgl;
	  	//cout<<i<<' '<<ans<<'\n';
	  	//break;
		}
} 

int main()
{
	cin>>n;
	gen=n;
	for(int i=1;i<=n;i++)
	{
		int a;
		cin>>a;
		//if(a!=i)
		//{
		  add(a,i);
			fa[i]=a;
			//pre[a]=i;
			c[a]++;
			rr[i]++;
		//}		
	}
	//cout<<c[1]<<'\n';
	bfs();
	
	find();
	
	cout<<ans;
	
	return 0;
} 
2024/9/25 17:37
加载中...