30分求助
查看原帖
30分求助
368225
WinterRain208楼主2021/1/30 12:12

不知道哪里挂了qwqqwq

记录

#include<bits/stdc++.h>
#define F(i,j,r) for(int i=j;i<=r;++i)
#define RI register int

using namespace std;
const int N=5e6+5;

inline int read(){
	RI f=1,x=0;
	char s=getchar();
	while(s<'0'||s>'9'){if(s=='-') f=-1;s=getchar();}
	while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+s-'0';s=getchar();}
	return x*f;
}

int x,y,ans=0;
int op;
int cnt[N],f[N];
int n,m;

int find(int k){
	if(f[k]==k)return k;
	else return f[k]=find(f[k]);
}

void unite(int x,int y){
	if(find(x)==find(y))return;
	if(cnt[find(x)]<cnt[find(y)])f[find(x)]=find(y);
	else{
		f[find(y)]=find(x);
		if(cnt[x]==cnt[y])++cnt[x];
	}
}
int main(){
	n=read(),m=read();
	F(i,0,n*3-1)cnt[i]=0,f[i]=i;
	F(i,1,m){
		op=read(),x=read(),y=read();
		int t=op,xx=x-1,yy=y-1;
		if(xx<0||n<=x||y<0||n<=y){
			++ans;
			continue;
		}
		if(t==1){
			if(find(x)==find(y+n)||find(x)==find(y+n*2))++ans;
			else{
				unite(x,y);
				unite(x+n,y+n);
				unite(x+n+n,y+n+n);
			}
		}
		else{
			if(find(x)==find(y)||find(x)==find(y+n*2))++ans;
			else{
				unite(x,y+n);
				unite(x+n,y+n+n);
				unite(x+n+n,y);
			}
		}
	}
	printf("%d",ans);
	return 0;
}
2021/1/30 12:12
加载中...