这为什么RE啊,而且只有官方数据会RE,之前民间数据都没有这个问题
#include <bits/stdc++.h>
#define debug puts("debug");
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
const int N = 4000010;
int n,m;
int ans;
int fa[N],f[N],sz[N];
int tg[N];
int idx[N];
vector <int> e[N];
bool st[N];
int find(int k[],int x) {
if(x == k[x]) return x;
k[x] = find(k,k[x]);
return k[x];
}
void dfs(int rt,int u,int fa) {
tg[u] = rt;
st[u] = 1;
for(auto v : e[u]) {
if(v == fa) continue;
if(!st[v]) dfs(rt,v,u);
}
}
void solve() {
scanf("%d%d",&n,&m);
int num = n * 2 + 3;
memset(f,0,sizeof f);
memset(st,0,sizeof st);
memset(tg,0,sizeof tg);
for(int i = 1;i <= 4 * n;i++)
fa[i] = i, sz[i] = 1, e[i].clear();
for(int i = 1;i <= num;i++)
idx[i] = i;
auto modify1 = [&](int x,char c) {
idx[x] += num;
idx[x + n] += num;
int &p = fa[idx[x]],&q = fa[idx[x + n]]; q = p = n * 2;
if(c == 'T')
p++, q += 2;
if(c == 'F')
p += 2, q += 2;
if(c == 'U')
p += 3, q += 3;
sz[p] += sz[idx[x]]; sz[q] += sz[idx[x + n]];
};
auto modify2 = [&](int a,int b,char c) {//b -> a
if(a == b && c == '+') return;
if(a == b) {
idx[a] += num;
fa[idx[a]] = idx[b + n];
idx[a + n] += num;
fa[idx[a + n]] = idx[b];
sz[idx[b + n]] += sz[idx[a]];
sz[idx[b]] += sz[idx[a + n]];
return;
}
idx[a] += num;
idx[a + n] += num;
if(c == '+') {
fa[idx[a]] = idx[b];
fa[idx[a + n]] = idx[b + n];
sz[idx[b]] += sz[idx[a]];
sz[idx[b + n]] += sz[idx[a + n]];
}
else {
fa[idx[a]] = idx[b + n];
fa[idx[a + n]] = idx[b];
sz[idx[b + n]] += sz[idx[a]];
sz[idx[b]] += sz[idx[a + n]];
}
};
for(int i = 1;i <= m;i++) {
char opt;
int a,b;
cin >> opt >> a;
if(opt == 'T' || opt == 'F' || opt == 'U') {
//now number idx[a]
modify1(a,opt);
} else {
scanf("%d",&b);
modify2(a,b,opt);//b -> a
}
}
ans = 0;
for(int i = 1;i <= n * 2;i++)
f[i] = i;
for(int i = 1;i <= n;i++) {
int p = find(fa,idx[i]);
if(p == i + n || p == num) {
e[num].push_back(i);
e[num].push_back(i + n);
e[i].push_back(num);
e[i + n].push_back(num);
continue;
}
e[p].push_back(i);
e[i].push_back(p);
if(p == 2 * n + 1) {
e[i + n].push_back(p + 1);
e[p + 1].push_back(i + n);
}
if(p == 2 * n + 2) {
e[i + n].push_back(p - 1);
e[p - 1].push_back(i + n);
}
if(p > n && p <= 2 * n) {
e[i + n].push_back(p - n);
e[p - n].push_back(i + n);
}
if(p <= n) {
e[i + n].push_back(p + n);
e[p + n].push_back(i + n);
}
//i & f[i]
}
for(int i = 1;i <= num;i++) {
if(!st[i]) {
dfs(i,i,-1);
}
}
for(int i = 1;i <= n;i++)
if(tg[i] == tg[i + n]) ans++;
printf("%d\n",ans);
}
int main() {
//freopen("tribool.in","r",stdin);
//freopen("tribool.out","w",stdout);
int c,t;
scanf("%d%d",&c,&t);
while(t--) {
solve();
}
return 0;
}