#8被卡常求救
查看原帖
#8被卡常求救
788881
ririTLE楼主2024/10/12 19:44
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int s=0;char ch=getchar();
	while(ch>'9'||ch<'0') ch=getchar();
	while(ch>='0'&&ch<='9'){
		s=(s<<1)+(s<<3)+ch-48;
		ch=getchar();
	}
	return s;
}
struct lain{
	int net,val;
}z[100005];
struct node{
	int size,p;
}sor[100005];
int n,m,u,v,a[100005],ans,T;
int head1[100005],head2[100005],c[100005],cntz;
bool d[100005],ok,dfn[100005],hc[100005];
char op;
void U(int x){
	if(c[x]==0) return ;
	c[x]=0;ans++;
	for(int i=head1[x];i;i=z[i].net) U(z[i].val);
	for(int i=head2[x];i;i=z[i].net) U(z[i].val);
	return ;
}
void TF(int x,int y){
	if(c[x]!=2&&c[x]!=y){
		ok=0;return ;
	}
	if(c[x]==y) return ;
	c[x]=y;
	for(int i=head1[x];i;i=z[i].net){
		TF(z[i].val,y);if(!ok) return ;
	}
	for(int i=head2[x];i;i=z[i].net){
		TF(z[i].val,-y);if(!ok) return ;
	}
	return ;
}
void Count(int x){
	if(dfn[x]) return ;
	sor[x].p=1;dfn[x]=1;hc[x]=1;
	for(int i=head1[x];i;i=z[i].net){
		Count(z[i].val);sor[x].p+=sor[z[i].val].p;
	}
	for(int i=head2[x];i;i=z[i].net){
		Count(z[i].val);sor[x].p+=sor[z[i].val].p;
	}
	dfn[x]=0;
	return ;
}
bool cmp(node x,node y){
	return x.p>y.p;
}
int main(){
//	freopen("tribool4.in","r",stdin);
//	freopen("tribool.out","w",stdout);
	T=read();T=read();
	while(T--){
	n=read();m=read();cntz=0;ok=1;ans=0;
	for(int i=1;i<=n;i++) a[i]=i,c[i]=2,d[i]=0,z[i].net=0,head1[i]=0,head2[i]=0,hc[i]=0;
	for(int i=1;i<=m;i++){
		cin>>op;u=read();
		if(op=='T'){
			a[u]=1000000;d[u]=1;
		}
		else if(op=='F'){
			a[u]=-1000000;d[u]=1;
		}
		else if(op=='U'){
			a[u]=0;d[u]=1;
		}
		else if(op=='+'){
			v=read();
			if(d[v]==1){
				d[u]=1;a[u]=a[v];
			}
			else{
				d[u]=0;a[u]=a[v];
			}
		}
		else{
			v=read();
			if(d[v]==1){
				d[u]=1;a[u]=-a[v];
			}
			else{
				d[u]=0;a[u]=-a[v];
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(!d[i]){
			if(a[i]>0){
				z[++cntz].net=head1[a[i]];head1[a[i]]=cntz;z[cntz].val=i;
			}
			else{
				z[++cntz].net=head2[-a[i]];head2[-a[i]]=cntz;z[cntz].val=i;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(a[i]==0) U(i);
		if(a[i]==1000000) TF(i,1);
		if(a[i]==-1000000) TF(i,-1);
	}
	for(int i=1;i<=n;i++){
		if(c[i]==2&&!hc[i]) Count(i);
		sor[i].size=i;
	}
	sort(sor+1,sor+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(c[sor[i].size]==2){
			ok=1;TF(sor[i].size,1);
			if(ok==0) U(sor[i].size);
			else if(a[sor[i].size]==-sor[i].size) U(sor[i].size);
		}
	}
	printf("%d\n",ans);
	}
	return 0;
}
2024/10/12 19:44
加载中...