NOIP T2 TLE
  • 板块学术版
  • 楼主xtaw6666
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/21 23:25
  • 上次更新2023/11/22 17:33:59
查看原帖
NOIP T2 TLE
896135
xtaw6666楼主2023/11/21 23:25

洛谷上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;
}
2023/11/21 23:25
加载中...