求调,sub4 WA前三个点
查看原帖
求调,sub4 WA前三个点
548270
RAND_MAX楼主2024/2/28 15:36
#include<bits/stdc++.h>
#define int long long
using namespace std;
void write(int x)
{
	static int st[35],top=0;
	if(x<0)
	{
		x=-x;
		putchar('-');
	}
	do
	{
		st[top++]=x%10;
		x/=10;
	}while(x);
	while(top)
	{
		putchar(st[--top]+48);
	}
}
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0')
	{
		if(c=='-') 
		{
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9') 
	{
		x=(x<<1)+(x<<3)+c-48;
		c=getchar();
	}
	return x*f;
}
int T,n,m,a[100010],col[100010],tot,b[100010],id;
vector<int>g[100010],g1[100010],s,g2[100010];
bool vis[100010],fl,fl1,fl2,vi[100010];
void init()
{	
	tot=id=0;//int
	fl=fl1=fl2=0;//bool
	memset(col,0,sizeof col);
	memset(vis,0,sizeof vis);
	memset(a,0,sizeof a);
	memset(vi,0,sizeof vi);
	memset(b,0,sizeof b);
	s.clear();
}
void add(int x,int y)
{
	g[x].push_back(y);
	g1[y].push_back(x);
}
void dfs1(int x)
{
	vis[x]=1;
	for(int i:g[x])
	{
		if(!vis[i])
		{
			dfs1(i);
		}
	}
	s.push_back(x);
}
void dfs2(int x)
{
	col[x]=tot;
	if(b[tot]!=a[x])
	{
		fl=1;
	}
	for(int i:g1[x])
	{
		if(!col[i])
		{
			dfs2(i);
		}
	}
}
void dfs3(int x)
{
	vi[x]=1;
	if(!b[x])
	{
		fl1=1;
	}
	for(int i:g2[x])
	{
		if(!vi[i])
		{
			dfs3(i);
		}
	}
}
void kosaraju()
{
	for(int i=1;i<=n;i++)
	{
		if(!vis[i])
		{
			dfs1(i);
		}
	}
	for(int i=n-1;i>=0;i--)
	{
		if(!col[s[i]])
		{
			tot++;
			b[tot]=a[s[i]];
			dfs2(s[i]);
		}
	}
}
signed main()
{
	cin>>T;
	while(T--)
	{
		init();
		n=read();
		m=read();
		for(int i=1;i<=n;i++)
		{
			a[i]=read();
			g[i].clear();
			g1[i].clear();
		}
		int x,y;
		while(m--)
		{
			x=read();
			y=read();
			add(x,y);
		}
		kosaraju();
		/*cout<<tot<<endl;
		for(int i=1;i<=n;i++)
		{
			cout<<col[i]<<" ";
		}
		cout<<endl;*/
		if(fl)
		{
			putchar('N');
			continue;
		}
		for(int i=1;i<=tot;i++)
		{
			g2[i].clear();
		}
		for(int i=1;i<=n;i++)
		{
			for(int j:g[i])
			{
				if(col[i]!=col[j])
				{
					g2[col[i]].push_back(col[j]);
					//cout<<col[i]<<" "<<col[j]<<endl;
				}
			}
		}
		for(int i=tot;i>=1;i--)
		{
			if(b[i]==1)
			{
				id=i;
				break;
			}
		}
		if(!id)
		{
			putchar('B');
			continue;
		}
		dfs3(id);
		for(int i=1;i<=tot;i++)
		{
			if(b[i]&&!vi[i])
			{
				fl1=1;
				break;
			}
		}
		if(!fl1)
		{
			putchar('A');
			continue;
		}
		if(tot==2)
		{
			if(!g2[1].size()&&!g2[2].size())
			{
				putchar('B');
			}
			else if(b[1]&&!b[2]&&g2[1].size()==1&&g2[2].size()==0)
			{
				putchar('B');
			}
			else if(!b[1]&&b[2]&&g2[2].size()==1&&g2[1].size()==0)
			{
				putchar('B');	
			}
			else
			{
				putchar('N');
			}
		}
		else
		{
			putchar('N');
		}
	}
	return 0;
}
2024/2/28 15:36
加载中...