QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#606104#8757. 图UESTC_OldEastWestRE 88ms3612kbC++172.5kb2024-10-02 22:10:162024-10-02 22:10:16

Judging History

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

  • [2024-10-02 22:10:16]
  • 评测
  • 测评结果:RE
  • 用时:88ms
  • 内存:3612kb
  • [2024-10-02 22:10:16]
  • 提交

answer

#include <bits/stdc++.h>

void charming() {
  int n, m; std::cin >> n >> m;
  int k = (m + n - 2) / (n - 1);
  std::vector G(k, std::vector (n, std::vector<int> ()));
  std::vector<std::vector<int> > pre(k, std::vector<int> (n));
  for (int i = 0; i < k; ++i) {
    std::iota(pre[i].begin(), pre[i].end(), 0);
  }

  std::function<int(int, int)> find = [&](int d, int x) {
    if (x == pre[d][x]) return x;
    else return pre[d][x] = find(d, pre[d][x]);
  };

  std::function<bool(int, int, int)> Check = [&](int d, int u, int v) {
    int fu = find(d, u), fv = find(d, v);
    if (fu == fv) return false;
    else return true;
  };

  std::function<std::vector<std::vector<int> >(int, int)> Solve 
  = [&](int st, int en) {
    std::vector<std::vector<int> > path; 
    for (int i = 0; i < k; ++i) {
      std::vector<int> new_path;
      std::vector<int> que, lst(n, -1);
      que.emplace_back(st);
      int head = 0, tail = 1;
      while (head < tail) {
        int u = que[head++];
        for (int v : G[i][u]) {
          if (lst[v] == -1 && v != st) {
            lst[v] = u;
            que.emplace_back(v);
            ++tail;
          }
        }
      }
      // assert(lst[en] != -1);
      int now = en;
      while (now > -1) {
        new_path.emplace_back(now);
        now = lst[now];
      }
      reverse(new_path.begin(), new_path.end());
      path.emplace_back(new_path);
    }

    return path;
  };

  bool ok = false;
  std::vector<std::vector<int> > path;
  int st = -1, en = -1;
  for (int i = 0, u, v; i < m; ++i) {
    std::cin >> u >> v, --u, --v;
    int l = 0, r = k - 1, idx = r;
    while (l <= r) {
      int mid = l + r >> 1;
      if (Check(mid, u, v)) r = mid - 1, idx = mid;
      else l = mid + 1;
    }

    G[idx][u].emplace_back(v);
    G[idx][v].emplace_back(u);
    int fu = find(idx, u), fv = find(idx, v);
    pre[idx][fu] = fv;

    if (idx == k - 1) {
      ok = true;
      st = u, en = v;
      path = Solve(st, en);
      break;
    }
  }
  if (ok) {
    std::cout << st + 1 << ' ' << en + 1 << '\n';
    for (auto vec : path) {
      int cnt = vec.size();
      std::cout << cnt << ' ';
      for (int i = 0 ; i < cnt; ++i) {
        std::cout << vec[i] + 1 << " \n"[i == cnt - 1];
      }
    }
  }
  else std::cout << -1 << '\n';
}

signed main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(NULL);
  std::cout.tie(NULL);
  int t; std::cin >> t;
  while (t--) charming();
  return 0;
}

详细

Test #1:

score: 100
Accepted
time: 88ms
memory: 3612kb

input:

10000
2 20
1 2
1 2
2 1
1 2
1 2
2 1
1 2
2 1
1 2
1 2
1 2
1 2
2 1
1 2
1 2
2 1
1 2
1 2
1 2
2 1
2 20
2 1
2 1
2 1
2 1
2 1
1 2
1 2
1 2
1 2
2 1
1 2
1 2
2 1
1 2
1 2
2 1
1 2
1 2
2 1
1 2
2 20
1 2
2 1
1 2
1 2
2 1
2 1
1 2
1 2
2 1
2 1
1 2
1 2
1 2
1 2
2 1
1 2
1 2
1 2
2 1
2 1
2 20
1 2
2 1
2 1
1 2
1 2
1 2
2 1
1 2
2 ...

output:

2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1 2
2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
2 2 1
...

result:

ok Answer correct. (10000 test cases)

Test #2:

score: -100
Runtime Error

input:

10000
5 20
2 1
2 5
5 3
3 1
4 5
1 4
4 3
4 5
3 5
5 4
2 3
5 2
3 4
3 5
1 4
4 3
4 2
2 1
1 3
5 1
5 20
4 2
1 3
1 2
4 5
2 4
3 1
5 3
5 1
4 5
4 3
2 4
1 4
4 3
5 2
1 2
3 5
1 5
4 1
3 4
4 3
5 20
1 4
1 3
1 5
5 1
4 5
3 4
4 5
2 3
1 2
2 4
4 5
4 5
2 4
2 5
4 2
4 3
4 2
2 5
2 1
3 1
5 20
2 5
2 3
4 5
4 2
3 4
2 1
5 4
2 5
2 ...

output:


result: