QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#846571#9771. Guessing Gamenhuang685WA 447ms75088kbC++236.6kb2025-01-07 10:36:062025-01-07 10:36:13

Judging History

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

  • [2025-01-07 10:36:13]
  • 评测
  • 测评结果:WA
  • 用时:447ms
  • 内存:75088kb
  • [2025-01-07 10:36:06]
  • 提交

answer

/**
 * @author n685
 * @date 2024-12-28 19:20:21
 */
#include "bits/stdc++.h"

#ifdef LOCAL
#include "dd/debug.h"
#else
#define dbg(...) 42
#define dbg_proj(...) 420
#define dbg_rproj(...) 420420
void nline() {}
void bar() {}
void start_clock() {}
void end_clock() {}
#endif

namespace rs = std::ranges;
namespace rv = std::views;

using u32 = unsigned int;
using i64 = long long;
using u64 = unsigned long long;

// constexpr int N = 10;
constexpr int N = 1e5;

struct Tree {
  static constexpr int LG = std::bit_width<u32>(N - 1);
  int n;
  const std::vector<std::vector<int>>& adj;
  std::vector<int> p, d, sub;
  std::vector<std::vector<int>> lift;
  std::vector<int> tl, tr;
  void dfs(int node, int par, int& cnt) {
    tl[node] = cnt++;
    p[node] = par;
    for (int i : adj[node]) {
      if (i == par) {
        continue;
      }
      d[i] = d[node] + 1;
      dfs(i, node, cnt);
      sub[node] += sub[i];
    }
    tr[node] = cnt - 1;
  }
  explicit Tree(const std::vector<std::vector<int>>& adj_)
      : n(static_cast<int>(adj_.size())),
        adj(adj_),
        p(n, -1),
        d(n),
        sub(n, 1),
        lift(LG, std::vector<int>(n, -1)),
        tl(n),
        tr(n) {
    int cnt = 0;
    for (int i = 0; i < n; ++i) {
      if (p[i] == -1) {
        dfs(i, -1, cnt);
      }
    }
    lift[0] = p;
    for (int i = 1; i < LG; ++i) {
      for (int j = 0; j < n; ++j) {
        if (lift[i - 1][j] != -1) {
          lift[i][j] = lift[i - 1][lift[i - 1][j]];
        }
      }
    }
  }
  int up(int u, int dist) const {
    if (dist < 0) {
      return -1;
    }
    if (d[u] < dist) {
      return -1;
    }
    for (int i = 0; i < LG; ++i) {
      if (((1 << i) & dist) != 0) {
        u = lift[i][u];
      }
    }
    return u;
  }
  // is v an ancestor of u?
  bool ancestor(int u, int v) const { return tl[u] <= tl[v] && tl[v] <= tr[u]; }

  int lca(int u, int v) const {
    if (d[u] < d[v]) {
      std::swap(u, v);
    }
    if (ancestor(v, u)) {
      return v;
    }
    for (int i = LG - 1; i >= 0; --i) {
      if (d[u] >= (1 << i) && !ancestor(lift[i][u], v)) {
        u = lift[i][u];
      }
    }
    return p[u];
  }
  int dist(int u, int v) const { return d[u] + d[v] - 2 * d[lca(u, v)]; }
};

struct DSU {
  std::vector<int> val;
  int cnt{};
  DSU() = default;
  explicit DSU(int n) : val(n, -1), cnt(n) {}
  int find(int i) { return val[i] < 0 ? i : (val[i] = find(val[i])); }
  bool unite(int u, int v) {
    u = find(u), v = find(v);
    if (u == v) {
      return false;
    }
    val[u] += val[v];
    val[v] = u;
    --cnt;
    return true;
  }
  bool connected(int u, int v) { return find(u) == find(v); }
  int size(int u) { return -val[find(u)]; }
  int count() const { return cnt; }
};

template <class T> std::array<T, 2> conv(const std::pair<T, T>& p) {
  return {p.first, p.second};
}
bool det(int u, int v, int dist) {
  if (u < N && v < N) {
    return dist % 4 == 2;
  }
  if (u >= N && v >= N) {
    return dist % 4 == 0;
  }
  return dist % 4 == 1;
}

std::array<int, 2> stay{N, N};
struct DSU2 {
  const Tree& tr;
  std::vector<int> val, dist;
  std::vector<std::array<int, 2>> ep;
  int cnt{};
  explicit DSU2(const Tree& tr_)
      : tr(tr_),
        val(tr.n, -1),
        dist(tr.n),
        ep(tr.n),
        cnt(tr.n) {
    for (int i = 0; i < tr.n; ++i) {
      ep[i] = {i, i};
    }
  }
  int find(int i) { return val[i] < 0 ? i : (val[i] = find(val[i])); }
  bool unite(int u, int v) {
    u = find(u), v = find(v);
    if (u == v) {
      return false;
    }
    if (val[u] > val[v]) {
      std::swap(u, v);
    }
    val[u] += val[v];
    val[v] = u;
    if (ep[u][0] != -1) {
      --stay[det(ep[u][0], ep[u][1], dist[u])];
    }
    if (ep[v][0] != -1) {
      --stay[det(ep[v][0], ep[v][1], dist[v])];
    }
    if (ep[u][0] != -1 && ep[v][0] != -1) {
      std::array<int, 2> nv = ep[u];
      if (dist[u] < dist[v]) {
        dist[u] = dist[v];
        nv = ep[v];
      }
      for (int i : ep[u]) {
        for (int j : ep[v]) {
          int cd = tr.dist(i, j);
          if (dist[u] < cd) {
            dist[u] = cd;
            nv = {i, j};
          }
        }
      }
      ep[u] = nv;
      ++stay[det(ep[u][0], ep[u][1], dist[u])];
    } else {
      ep[u] = {-1, -1};
    }
    --cnt;
    return true;
  }
  bool connected(int u, int v) { return find(u) == find(v); }
  int size(int u) { return -val[find(u)]; }
  int count() const { return cnt; }
};

int main() {
#ifndef LOCAL
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
#endif

  int q;
  std::cin >> q;

  DSU dsu(2 * N);
  std::vector<std::vector<int>> adj1(2 * N);
  std::vector<int> a(q), b(q);
  for (int i = 0; i < q; ++i) {
    std::cin >> a[i] >> b[i];
    --a[i];
    b[i] += N - 1;
    if (dsu.unite(a[i], b[i])) {
      adj1[a[i]].push_back(b[i]);
      adj1[b[i]].push_back(a[i]);
    }
  }
  Tree tr(adj1);

  std::vector<int> p(2 * N, -1);
  std::vector<bool> cy(2 * N);
  std::vector<std::vector<int>> adj(2 * N);
  auto dfs = [&](auto&& self, int node, int par) -> void {
    assert(p[node] == -1);
    p[node] = par;
    for (int i : adj[node]) {
      if (i == par) {
        continue;
      }
      self(self, i, node);
    }
  };

  auto rem = [&](int node) {
    while (node != -1 && !cy[node]) {
      cy[node] = true;
      ++stay[node >= N];
      int pre = node;
      node = p[node];
      p[pre] = -1;
    }
  };

  DSU2 dsu2(tr);
  for (int i = 0; i < q; ++i) {
    if (!dsu2.connected(a[i], b[i])) {
      // different cc
      int rt1 = dsu2.find(a[i]);
      int rt2 = dsu2.find(b[i]);
      if (dsu2.ep[rt1][0] == -1) {
        if (dsu2.ep[rt2][0] == -1) {
          // merge two cc with cycles
          rem(a[i]);
          rem(b[i]);
        } else {
          // first cc has cycle, second does not
          dfs(dfs, b[i], a[i]);
        }
      } else if (dsu2.ep[rt2][0] == -1) {
        // first cc doesn't have cycle, second does
        dfs(dfs, a[i], b[i]);
      }
    } else {
      // same cc
      int rt = dsu2.find(a[i]);
      if (dsu2.ep[rt][0] != -1) {
        // first cycle
        --stay[det(dsu2.ep[rt][0], dsu2.ep[rt][1], dsu2.dist[rt])];
        dsu2.ep[rt] = {-1, -1};
        dfs(dfs, a[i], -1);
        rem(b[i]);
      } else {
        rem(a[i]);
        rem(b[i]);
      }
    }
    adj[a[i]].push_back(b[i]);
    adj[b[i]].push_back(a[i]);
    dsu2.unite(a[i], b[i]);
    std::cout << N - stay[0] << ' ' << N - stay[1] << '\n';
  }
}


详细

Test #1:

score: 100
Accepted
time: 4ms
memory: 34524kb

input:

4
1 1
1 2
2 1
2 2

output:

1 0
0 2
1 2
0 0

result:

ok 8 numbers

Test #2:

score: 0
Accepted
time: 119ms
memory: 45328kb

input:

250000
49324 49323
44443 44445
92513 92513
69591 69591
52085 52082
95024 95025
21004 21005
34373 34371
60771 60772
17131 17134
34885 34882
6011 6015
56103 56105
21055 21054
71592 71593
14894 14895
25774 25771
96225 96224
16444 16442
48432 48432
86954 86952
7202 7202
38661 38665
20063 20063
85383 853...

output:

1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 0
33 0
34 0
35 0
36 0
37 0
38 0
39 0
40 0
41 0
42 0
43 0
44 0
45 0
46 0
47 0
48 0
49 0
50 0
51 0
52 0
53 0
54 0
55 0
56 0
57 0
58 0
59 0
60 0
61 0
62 0...

result:

ok 500000 numbers

Test #3:

score: 0
Accepted
time: 204ms
memory: 53156kb

input:

500000
94699 94691
39066 39061
70924 70923
55402 55402
88622 88624
207 205
90609 90603
45892 45892
78872 78873
2321 2323
44788 44785
45517 45515
46316 46315
31599 31594
75478 75473
54876 54872
68947 68941
56371 56375
95794 95791
52971 52975
9094 9095
38174 38174
72230 72221
75527 75523
45981 45984
2...

output:

1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 0
33 0
34 0
35 0
36 0
37 0
38 0
39 0
40 0
41 0
42 0
43 0
44 0
45 0
46 0
47 0
48 0
49 0
50 0
51 0
52 0
53 0
54 0
55 0
56 0
57 0
58 0
59 0
60 0
61 0
62 0...

result:

ok 1000000 numbers

Test #4:

score: 0
Accepted
time: 208ms
memory: 53292kb

input:

500000
24924 24924
68134 68136
60184 60190
30242 30246
4652 4654
41325 41326
51273 51277
14181 14190
52941 52947
12605 12602
62014 62013
25274 25272
28923 28926
22913 22918
82081 82081
84712 84715
13824 13828
39794 39798
4625 4630
69325 69325
87294 87297
56584 56586
16534 16536
47811 47817
71493 714...

output:

1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 0
33 0
34 0
35 0
36 0
37 0
38 0
39 0
40 0
41 0
42 0
43 0
44 0
45 0
46 0
47 0
48 0
49 0
50 0
51 0
52 0
53 0
54 0
55 0
56 0
57 0
58 0
59 0
60 0
61 0
62 0...

result:

ok 1000000 numbers

Test #5:

score: 0
Accepted
time: 388ms
memory: 66732kb

input:

1000000
41061 41062
81529 81527
59603 59610
62143 62144
30555 30554
5734 5739
72323 72326
9181 9182
81989 81981
97599 97598
58337 58334
76316 76314
43062 43065
61562 61570
54986 54981
41125 41126
62797 62792
27930 27928
31425 31423
63331 63334
56781 56785
14300 14300
85147 85147
11465 11461
6465 646...

output:

1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 0
33 0
34 0
35 0
36 0
37 0
38 0
39 0
40 0
41 0
42 0
43 0
44 0
45 0
46 0
47 0
48 0
49 0
50 0
51 0
52 0
53 0
54 0
55 0
56 0
57 0
58 0
59 0
60 0
61 0
62 0...

result:

ok 2000000 numbers

Test #6:

score: 0
Accepted
time: 165ms
memory: 54212kb

input:

1000000
1925 271
992 320
1726 916
358 199
512 1789
1533 802
395 254
1300 1197
695 1727
842 1084
574 155
884 115
1103 1073
555 156
1885 1990
571 1685
958 417
38 1439
253 766
1423 1280
1049 1788
1088 1490
468 1663
260 290
20 110
733 1682
1925 1062
1263 1287
1972 1893
147 1659
1302 880
101 1084
1647 26...

output:

1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
25 2
26 2
27 2
28 2
29 2
30 2
31 2
32 2
33 2
34 2
35 2
36 2
37 2
38 2
39 2
40 2
41 2
42 2
43 2
44 2
45 2
46 2
47 2
48 2
49 2
50 2
51 2
52 2
53 2
54 2
55 2
56 2
57 2
58 2
59 2
60 2...

result:

ok 2000000 numbers

Test #7:

score: 0
Accepted
time: 176ms
memory: 53896kb

input:

1000000
2003 3287
1503 4809
2504 3209
2096 1631
3667 2309
2751 4519
4200 2858
3675 675
2178 1530
2616 318
2190 2155
1078 731
3629 4217
1471 4060
2599 1298
4997 3291
211 3328
4217 980
3960 995
4637 1089
1624 1181
1196 4493
3303 1476
3684 4938
2504 3163
4707 995
2608 1441
231 322
3145 3696
269 4899
42...

output:

1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
23 2
24 2
25 2
26 2
27 2
28 2
29 2
30 2
31 2
32 2
33 2
34 2
35 2
36 2
37 2
38 2
39 2
40 2
41 2
42 2
43 2
44 2
45 2
46 2
47 2
48 2
49 2
50 2
51 2
52 2
53 2
54 2
55 2
56 2
57 2
58 2
57 4
58 4...

result:

ok 2000000 numbers

Test #8:

score: 0
Accepted
time: 215ms
memory: 54460kb

input:

1000000
1837 4376
1052 9648
4335 9271
4840 4084
6502 4239
9550 3715
1066 9096
96 6657
1750 1698
182 9908
4366 5772
5609 1370
5379 7902
3417 2784
4192 3296
72 4923
2625 7408
3613 4083
967 4849
6242 3011
4725 678
1399 8507
3606 6251
1324 5150
8789 9677
203 3812
6450 796
6219 6601
9892 7312
8958 5068
8...

output:

1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 0
33 0
34 0
35 0
36 0
37 0
38 0
39 0
40 0
41 0
42 0
43 0
44 0
45 0
46 0
47 0
48 0
49 0
50 0
51 0
52 0
53 0
54 0
55 0
56 0
57 0
58 0
59 0
60 0
61 0
62 0...

result:

ok 2000000 numbers

Test #9:

score: 0
Accepted
time: 254ms
memory: 55928kb

input:

1000000
19985 17625
13035 937
10440 15619
15423 12700
18030 12495
1481 208
19158 3975
8791 19836
872 7918
16427 7401
992 1111
2745 10390
11693 19020
11948 9495
10995 13064
9665 8370
9545 6877
19657 5152
3452 7024
9548 17042
12522 792
12033 13610
328 5602
13463 16157
11325 19152
1776 17848
6212 8501
...

output:

1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 0
33 0
34 0
35 0
36 0
37 0
38 0
39 0
40 0
41 0
42 0
43 0
44 0
45 0
46 0
47 0
48 0
49 0
50 0
51 0
52 0
53 0
54 0
55 0
56 0
57 0
58 0
59 0
60 0
61 0
62 0...

result:

ok 2000000 numbers

Test #10:

score: 0
Accepted
time: 314ms
memory: 59912kb

input:

1000000
49837 28460
5880 13988
19553 42648
23669 24757
13700 49966
14572 10903
23434 46724
38797 13564
20940 44690
49481 150
46550 24152
19960 42861
12249 47093
32531 7325
33290 15073
6826 37493
35841 44068
19806 25656
16716 23548
2168 39136
21593 14652
12849 47830
15903 35143
10968 33371
16630 4648...

output:

1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 0
33 0
34 0
35 0
36 0
37 0
38 0
39 0
40 0
41 0
42 0
43 0
44 0
45 0
46 0
47 0
48 0
49 0
50 0
51 0
52 0
53 0
54 0
55 0
56 0
57 0
58 0
59 0
60 0
61 0
62 0...

result:

ok 2000000 numbers

Test #11:

score: 0
Accepted
time: 447ms
memory: 64664kb

input:

1000000
93180 5157
3929 22274
74152 19408
64555 3032
41026 64997
69695 59638
98521 45486
74944 59183
42898 94439
93452 13289
30434 73216
98067 65121
25303 6111
79419 78019
37424 22267
85407 95730
9888 61570
26155 53254
79695 73268
36130 89833
19257 84229
38585 40889
58221 66271
99481 65514
92655 754...

output:

1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 0
33 0
34 0
35 0
36 0
37 0
38 0
39 0
40 0
41 0
42 0
43 0
44 0
45 0
46 0
47 0
48 0
49 0
50 0
51 0
52 0
53 0
54 0
55 0
56 0
57 0
58 0
59 0
60 0
61 0
62 0...

result:

ok 2000000 numbers

Test #12:

score: -100
Wrong Answer
time: 313ms
memory: 75088kb

input:

1000000
1 1
1 2
2 2
2 3
3 3
3 4
4 4
4 5
5 5
5 6
6 6
6 7
7 7
7 8
8 8
8 9
9 9
9 10
10 10
10 11
11 11
11 12
12 12
12 13
13 13
13 14
14 14
14 15
15 15
15 16
16 16
16 17
17 17
17 18
18 18
18 19
19 19
19 20
20 20
20 21
21 21
21 22
22 22
22 23
23 23
23 24
24 24
24 25
25 25
25 26
26 26
26 27
27 27
27 28
28 ...

output:

1 0
0 2
1 2
2 2
3 2
2 4
3 4
4 4
5 4
4 6
5 6
6 6
7 6
6 8
7 8
8 8
9 8
8 10
9 10
10 10
11 10
10 12
11 12
12 12
13 12
12 14
13 14
14 14
15 14
14 16
15 16
16 16
17 16
16 18
17 18
18 18
19 18
18 20
19 20
20 20
21 20
20 22
21 22
22 22
23 22
22 24
23 24
24 24
25 24
24 26
25 26
26 26
27 26
26 28
27 28
28 28
...

result:

wrong answer 262147th numbers differ - expected: '65536', found: '65537'