QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#847575 | #9771. Guessing Game | nhuang685 | WA | 502ms | 75012kb | C++23 | 6.6kb | 2025-01-08 05:51:01 | 2025-01-08 05:51:03 |
Judging History
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';
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 3ms
memory: 34572kb
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: 136ms
memory: 45064kb
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: 256ms
memory: 53152kb
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: 249ms
memory: 53164kb
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: 500ms
memory: 66880kb
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: 171ms
memory: 54200kb
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: 174ms
memory: 53908kb
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: 202ms
memory: 54468kb
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: 272ms
memory: 55996kb
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: 377ms
memory: 59952kb
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: 502ms
memory: 64872kb
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: 388ms
memory: 75012kb
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'