思路:fa数组记录最后的赋值是什么。 ffa是并查集。
将每个 fax 与 x 合并,如果 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;
}