求助,最后两个点RE
查看原帖
求助,最后两个点RE
421634
QT___楼主2024/6/16 11:43

rt,快要死了,错误代码是3221225725

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define MAXN 200050

typedef long long LL;
using namespace std;

int n,m,c,t,T=200001,F=200002,U=200003;
int fa[MAXN],v[MAXN];
string opt;
int xi,yi,cnt=0;
int read()
{
	int xx=0,ff=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') ff=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){xx=xx*10+ch-'0';ch=getchar();}
	return xx*ff;
}
void write(int xx)
{
	if(xx<0){putchar('-');xx=-xx;}
	if(xx>9){write(xx/10);}
	putchar(xx%10+'0');
	return;
}
void Start()
{
	c=read();t=read();
	return;
}
int fd(int wh)
{
	if(fa[wh]==wh) return wh;
	fa[wh]=fd(fa[wh]);
	return fa[wh];
}
void hb(int xx,int yy)
{
	fa[fd(xx)]=fd(yy);
	return;
}
int main()
{
//	freopen("tribool4.in","r",stdin);
//	freopen("1.out","w",stdout);
	Start();
	fa[T]=T;
	fa[F]=F;
	fa[U]=U;
	while(t--)
	{
		n=read();m=read();
		cnt=0;
		for(int i=1;i<=n;i++) v[i]=i;
		for(int i=1;i<=2*n;i++) fa[i]=i;
		while(m--)
		{
			cin>>opt;
			xi=read();
			if(opt[0]=='+'){yi=read();v[xi]=v[yi];}
			if(opt[0]=='-'){yi=read();v[xi]=-v[yi];}
			if(opt[0]=='T'){v[xi]=T;}
			if(opt[0]=='F'){v[xi]=F;}
			if(opt[0]=='U'){v[xi]=U;}
		}
		for(int i=1;i<=n;i++)
		{
			if(v[i]==T||v[i]==F);
			else if(v[i]==U) hb(i,i+n);
			else if(v[i]>0) hb(i,v[i]),hb(i+n,v[i]+n);
			else if(v[i]<0) hb(i,-v[i]+n),hb(i+n,-v[i]);
		}
		for(int i=1;i<=n;i++)
		{
			if(fd(i)==fd(i+n)) cnt++;
		}
		write(cnt);
		printf("\n");
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}
2024/6/16 11:43
加载中...