并查集求hack
查看原帖
并查集求hack
1014573
sevenki楼主2024/3/12 20:04

思路:fa数组记录最后的赋值是什么。 ffa是并查集。

将每个 faxfa_x 与 xx 合并,如果 x 和 反x在同一个集合内就计算入答案

WA60pts

#include<bits/stdc++.h>
#define F_sync ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr)
#define MAXN 300006
using namespace std;
using ll = long long;
const int T=211451;
const int F=211455;
const int U=211919;
int n,m;
int fa[MAXN];
int ffa[MAXN];
int fnd(int x){
	return x==ffa[x] ? x : ffa[x]=fnd(ffa[x]);
}
void solve(){
	cin>>n>>m;
	for(int i=0;i<MAXN;i++)fa[i]=i;
	for(int i=0;i<MAXN;i++)ffa[i]=i;
	while(m--){
		char op;int x,y;cin>>op>>x;
		switch(op){
			case 'T':
				fa[x]=T;fa[x+n]=F;break;
			case 'F':
				fa[x]=F;fa[x+n]=T;break;
			case 'U':
				fa[x]=U;fa[x+n]=U;break;
			case '+':
				cin>>y;
				fa[x]=fa[y];
				fa[x+n]=fa[y+n];
				break;
			case '-':
				cin>>y;
				fa[x]=fa[y+n];
				fa[x+n]=fa[y];
				break;
		}
	}
	int ans=0;
	for(int i=1;i<=2*n;i++){
		ffa[fnd(i)]=fnd(fa[i]);
	}
	for(int i=1;i<=n;i++){
		if(fnd(i)==fnd(i+n))ans++;
	}cout<<ans<<"\n";
}
int main() {
	F_sync;
	int c,t;cin>>c>>t;
	while(t--)solve();
	return 0;
}
2024/3/12 20:04
加载中...