洛谷上AC 小图灵上#6,#8,#10三个点TLE 想了好久不知道哪里时间复杂度高
#include <bits/stdc++.h>
using namespace std;
int vars[100005];
bool visited[100005];
bool recordVisited[100005];
int recordPath[100005];
int recordCount[100005];
int cur = 0;
int main() {
freopen("tribool.in", "r", stdin);
freopen("tribool.out", "w", stdout);
int c, t;
cin >> c >> t;
for (int a = 0; a < t; a ++) {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
vars[i] = i + 1;
}
for (int b = 0; b < m; b ++) {
char v;
cin >> v;
if (v == '+') {
int i, j;
cin >> i >> j;
vars[i] = vars[j];
} else if (v == '-') {
int i, j;
cin >> i >> j;
vars[i] = -vars[j];
} else {
int i;
cin >> i;
vars[i] = (v == 'F' ? -1 : (v == 'T' ? 1 : 0));
}
}
int ans = 0;
for (int i = 1; i <= n; i ++) {
if (vars[i] == -(i + 1)) {
vars[i] = 0;
} else if (vars[i] == (i + 1)) {
vars[i] = 1;
}
}
memset(visited, 0, sizeof(visited));
for (int i = 1; i <= n; i ++) {
if (!visited[i] && vars[i] != -1 && vars[i] != 0 && vars[i] != 1) {
int count = 0;
int from = i;
memset(recordVisited, 0, sizeof(recordVisited));
memset(recordCount, 0, sizeof(recordCount));
cur = 0;
bool flag = false;
do {
if (visited[from]) {
flag = true;
break;
}
visited[from] = true;
recordVisited[from] = true;
recordPath[cur ++] = from;
recordCount[from] = count;
if (vars[from] < 0) {
count ++;
}
from = abs(vars[from]) - 1;
} while (vars[from] != -1 && vars[from] != 0 && vars[from] != 1 && !recordVisited[from]);
if (flag) {
for (int j = cur - 1; j >= 0; j --) {
visited[recordPath[j]] = true;
}
continue;
}
if (vars[from] == -1 || vars[from] == 0 || vars[from] == 1) {
for (int j = cur - 1; j >= 0; j --) {
vars[recordPath[j]] = vars[from];
}
} else if (recordVisited[from]) {
if ((count - recordCount[from]) & 1) {
for (int k = 0; k < cur; k ++) {
vars[recordPath[k]] = 0;
}
}
}
}
}
for (int i = 1; i <= n; i ++) {
if (vars[i] == 0) {
ans ++;
}
}
cout << ans << endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}