QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#416154#4513. Slide ParadeWhicy0 2ms3452kbC++203.1kb2024-05-21 16:31:212024-05-21 16:31:22

Judging History

你现在查看的是最新测评结果

  • [2024-05-21 16:31:22]
  • 评测
  • 测评结果:0
  • 用时:2ms
  • 内存:3452kb
  • [2024-05-21 16:31:21]
  • 提交

answer

#include <cassert>
#include <iostream>
#include <ostream>
#include <vector>
int main() {
  // std::ios::sync_with_stdio(0);
  // std::cin.tie(nullptr);
  // std::cout.tie(nullptr);
  int T;
  std::cin >> T;
  for (int TC = 1; TC <= T; TC++) {
    std::cout << "Case #" << TC << ": ";
    int n, m;
    std::cin >> n >> m;
    std::vector<std::vector<int>> ed(n), rved(n);
    for (int i = 0; i < m; i++) {
      int u, v;
      std::cin >> u >> v;
      ed[--u].push_back(--v);
      rved[v].push_back(u);
    }
    std::vector<bool> con1(n), con2(n);
    int lst;
    auto scc1 = [&](auto scc1, int u) -> void {
      con1[u] = 1;
      for (auto v : ed[u])
        if (!con1[v])
          scc1(scc1, v);
      lst = u;
    };
    bool imp = 0;
    scc1(scc1, 0);
    for (int i = 0; i < n; i++) {
      if (!con1[i]) {
        imp = 1;
        break;
      }
    }
    auto scc2 = [&](auto scc2, int u) -> void {
      con2[u] = 1;
      for (auto v : rved[u])
        if (!con2[v])
          scc2(scc2, v);
    };
    scc2(scc2, lst);
    for (int i = 0; i < n; i++) {
      if (!con2[i]) {
        imp = 1;
        break;
      }
    }
    if (imp) {
      std::cout << "IMPOSSIBLE\n";
      continue;
    }
    std::vector<int> lnk(n, -1), vis(n, 0);
    auto dfs = [&](const auto &dfs, const int &u, std::vector<bool> &vis) -> bool {
      for (int v : ed[u]) {
        if (vis[v])
          continue;
        vis[v] = 1;
        if (!~lnk[v] || dfs(dfs, lnk[v], vis)) {
          lnk[v] = u;
          return true;
        }
      }
      return false;
    };
    int cnt = 0;
    for (int i = 0; i < n; i++) {
      std::vector<bool> vis(n, 0);
      if (dfs(dfs, i, vis))
        cnt++;
    }
    if (cnt < n) {
      std::cout << "IMPOSSIBLE\n";
      continue;
    }
    // begin
    std::vector<std::vector<int>> nwed(n);
    for (int u = 0; u < n; u++) {
      if (imp)
        break;
      for (auto v : ed[u]) {
        if (lnk[v] == u) {
          for (int i = 0; i < n; i++) {
            nwed[lnk[i]].push_back(i);
          }
          continue;
        }
        for (int i = 0; i < n; i++)
          if (lnk[i] == u)
            lnk[i] = -1;
        int tmp = lnk[v];
        lnk[v] = u;
        std::vector<bool> vis(n, 0);
        vis[v] = 1;
        if (!dfs(dfs, tmp, vis)) {
          imp = 1;
          break;
        }
        for (int i = 0; i < n; i++) {
          nwed[lnk[i]].push_back(i);
        }
      }
    }
    if (imp) {
      std::cout << "IMPOSSIBLE\n";
      continue;
    }
    // end
    std::cout << n * m + 1 << "\n";
    std::vector<int> ans;
    auto fnd = [&](const auto &fnd, const int &u) -> void {
      for (auto &x : nwed[u]) {
        int v = x;
        if (!~v)
          continue;
        x = -1;
        fnd(fnd, v);
        ans.push_back(u);
      }
    };
    fnd(fnd, 0);
    int st = 0;
    for (; ans[st] != 0; st++)
      ;
    for (int i = st; i < n * m; i++) {
      std::cout << ans[i] + 1 << " ";
    }
    for (int i = 0; i < st; i++) {
      std::cout << ans[i] + 1 << " ";
    }
    std::cout << "1\n";
  }
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 3452kb

input:

100
5 8
1 2
1 3
1 4
1 5
2 1
3 1
4 1
5 1
5 10
1 3
1 4
2 3
2 5
3 1
3 4
3 5
4 2
5 1
5 3
5 10
1 4
2 3
2 5
3 1
3 5
4 2
4 3
4 5
5 1
5 2
3 6
1 2
1 3
2 1
2 3
3 1
3 2
5 10
1 2
1 5
2 3
2 4
3 1
4 3
4 5
5 2
5 3
5 4
4 10
1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 4
4 2
4 3
5 10
1 2
1 3
2 1
2 4
3 1
3 5
4 2
4 5
5 3
5 4
5 10
1 ...

output:

Case #1: IMPOSSIBLE
Case #2: 51
1 5 3 2 4 1 5 3 2 4 1 5 3 2 4 1 5 2 4 3 1 3 5 2 4 1 3 5 2 4 1 5 3 2 4 1 3 5 2 4 1 5 2 4 3 1 3 5 2 4 1
Case #3: 51
1 5 2 5 3 2 4 1 3 2 5 2 5 4 1 3 4 1 5 3 2 4 1 5 3 2 5 2 5 2 4 1 3 4 1 3 4 1 5 3 2 4 1 5 3 2 4 1 3 4 1
Case #4: 19
1 3 2 1 3 2 1 2 3 1 2 3 1 3 2 1 2 3 1
Ca...

result:

wrong answer invalid move (from 1 to 5) (test case 2)

Test #2:

score: 0
Time Limit Exceeded

input:

100
199 4980
1 95
1 96
1 105
1 124
1 130
1 131
1 135
1 137
1 139
1 140
1 141
1 147
1 155
1 172
1 174
1 179
1 183
1 188
1 193
1 196
1 197
2 3
2 5
2 13
2 14
2 17
2 20
2 24
2 26
2 30
2 41
2 44
2 45
2 52
2 56
2 67
2 70
2 71
2 74
2 78
2 84
2 85
2 90
2 92
2 93
2 97
2 107
2 111
2 113
2 122
2 124
2 128
2 13...

output:

Case #1: IMPOSSIBLE
Case #2: IMPOSSIBLE
Case #3: 1000001
1 108 137 133 152 58 114 102 121 200 199 13 190 176 72 138 46 62 12 83 129 68 175 119 56 132 163 95 188 14 103 187 141 117 112 76 120 37 32 50 92 162 184 33 130 48 100 23 127 94 147 21 174 156 181 192 143 49 167 16 195 43 195 43 39 89 115 99 1...

result: