90分求助,测试点9没过
查看原帖
90分求助,测试点9没过
399941
曾治茗楼主2024/9/23 20:52
#include<bits/stdc++.h>
#define int long long

using namespace std;
const int maxN=1e7+10;
int fa[maxN],a[maxN];
int c,t;


int find(int x){
	if(x==fa[x])return x;
	else return fa[x]=find(fa[x]);
}

void merge(int x,int y){
	int xx=find(x);
	int yy=find(y);
	fa[yy]=xx;
}

signed main(){
	cin >> c >> t;
	while(t--){
		int n,m;
		cin >> n >> m;
		
		for(int i=1;i<=2*n+10;i++){
			fa[i]=i;
		}
		
		for(int i=1;i<=n;i++){
			a[i]=i;
		}
		
		merge(n+2,n*2+4);
		
		while(m--){
			int x,y;
			string s;
			cin >> s;
			if(s == "+"){
				cin >> x >> y;
				a[x] = a[y];
			}
			if(s == "-"){
				cin >> x >> y;
				a[x] = -a[y];
			}
			if(s == "T"){
				cin >> x ;
				a[x] = n+1;
			}
			if(s == "U"){
				cin >> x;
				a[x] = n+2;
			}
			if(s == "F"){
				cin >> x;
				a[x] = n*2+3;
			}
		}
		
		for(int i=1;i<=n;i++){
			if(a[i]>0){
				merge(i,a[i]);
				merge(i +n+2,a[i]+n+2);
			}
			else{
				merge(i,-a[i]+n+2);
				merge(i+n+2,-a[i]);
			}
		}
		int ans=0;
		for(int i=1;i<=n;i++){
			if(find(i) == find(i+n+2))ans++;
		}
		cout << ans << endl;
	}
	
	
	
	return 0;
}
2024/9/23 20:52
加载中...