QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#448647 | #8809. Telephone Plans | Qwerty1232 | 0 | 0ms | 3840kb | C++23 | 5.6kb | 2024-06-19 20:34:18 | 2024-06-19 20:34:19 |
answer
#include <bits/stdc++.h>
class ETT {
private:
using ind_t = int;
struct Node {
ind_t left, right, prev;
uint32_t y;
int sz;
Node() : left(-1), right(-1), prev(-1), sz(1) {
sizeof(Node);
static std::mt19937 rnd;
y = rnd();
}
};
std::vector<Node> data;
int get_sz(ind_t p) {
return p != -1 ? data[p].sz : 0;
}
void upd_prv(ind_t p, ind_t prv) {
if (p != -1) {
data[p].prev = prv;
}
}
void upd(ind_t p) {
if (p != -1) {
upd_prv(data[p].left, p);
upd_prv(data[p].right, p);
data[p].sz = 1 + get_sz(data[p].left) + get_sz(data[p].right);
}
}
ind_t merge(ind_t a, ind_t b) {
if (a == -1 || b == -1) {
return a != -1 ? a : b;
}
if (data[a].y < data[b].y) {
data[a].right = merge(data[a].right, b);
return upd(a), a;
} else {
data[b].left = merge(a, data[b].left);
return upd(b), b;
}
}
ind_t merge(std::initializer_list<ind_t> list) {
ind_t rt = -1;
for (ind_t ptr : list) {
rt = merge(rt, ptr);
}
return rt;
}
std::pair<ind_t, ind_t> split(ind_t p, int ind) {
if (p == -1) {
return {-1, -1};
}
if (get_sz(data[p].left) + 1 <= ind) {
auto [a, b] = split(((data[p].right != -1 ? data[data[p].right].prev = -1 : 0), data[p].right), ind - (get_sz(data[p].left) + 1));
data[p].right = a;
upd(p);
return {p, b};
} else {
auto [a, b] = split(((data[p].left != -1 ? data[data[p].left].prev = -1 : 0), data[p].left), ind);
data[p].left = b;
upd(p);
return {a, p};
}
}
template <int N>
std::array<ind_t, N> split(ind_t p, std::array<int, N - 1> ar) {
std::array<ind_t, N> res;
for (int i = 0; i < N - 1; i++) {
auto [a, b] = split(p, ar[i] - (i == 0 ? 0 : ar[i - 1]));
res[i] = a;
res[i + 1] = b;
p = b;
}
return res;
}
std::pair<ind_t, int> ascend(ind_t p) {
if (p == -1) {
return {p, 0};
}
int ind = get_sz(data[p].left);
while (data[p].prev != -1) {
ind += (get_sz(data[data[p].prev].left) + 1) * (p == data[data[p].prev].right);
p = data[p].prev;
}
return {p, ind};
}
std::vector<ind_t> vec;
std::map<std::pair<int, int>, std::pair<ind_t, ind_t>> map;
public:
ETT() = default;
ETT(int n) {
data.assign(3 * n, Node());
vec.resize(2 * n);
for (int i = 0; i < 2 * n; i++) {
vec[i] = n + i;
}
}
std::pair<int, int> add_edge(int u, int v) {
if (u > v) {
std::swap(u, v);
}
ind_t rt1 = u, rt2 = v;
ind_t uv = vec.rbegin()[0], vu = vec.rbegin()[1];
vec.pop_back(), vec.pop_back();
data[uv] = Node(), data[uv] = Node();
map[{u, v}] = {uv, vu};
auto [r1, ind1] = ascend(rt1);
auto [r2, ind2] = ascend(rt2);
int sz1 = get_sz(r1) / 3 + 1;
int sz2 = get_sz(r2) / 3 + 1;
auto [x1, y1] = split(r1, ind1);
auto [x2, y2] = split(r2, ind2);
auto rt = merge({x1, uv, y2, x2, vu, y1});
return {sz1, sz2};
}
std::pair<int, int> cut_edge(int u, int v) {
if (u > v) {
std::swap(u, v);
}
auto [uv, vu] = map[{u, v}];
map.erase({u, v});
auto [rt, ind1] = ascend(uv);
auto [__, ind2] = ascend(vu);
if (ind1 > ind2) {
std::swap(ind1, ind2);
}
auto [a, b, c, d, e] = split<5>(rt, {ind1, ind1 + 1, ind2, ind2 + 1});
auto f = merge(a, e);
vec.push_back(b);
vec.push_back(d);
int sz1 = get_sz(f) / 2 + 1;
int sz2 = get_sz(c) / 2 + 1;
return {sz1, sz2};
}
};
int32_t main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int E;
int n, q;
std::cin >> E >> n >> q;
int64_t all_dlt = 0, cur_sum = 0, last_ans = 0;
std::vector<int64_t> ans = {0};
ETT ett(n);
for (int i = 0; i < q; i++) {
int tp;
std::cin >> tp;
if (tp == 3) {
int64_t t;
std::cin >> t;
if (E == 1) {
t ^= last_ans;
}
ans.push_back(ans.back());
last_ans = ans.rbegin()[t] + all_dlt;
std::cout << ans.rbegin()[t] + all_dlt << "\n";
} else {
int64_t u, v;
std::cin >> u >> v;
if (E == 1) {
u ^= last_ans;
v ^= last_ans;
}
u--;
v--;
if (u > v) {
std::swap(u, v);
}
if (tp == 1) {
auto [sz1, sz2] = ett.add_edge(u, v);
int64_t dlt = int64_t(sz1) * sz2;
ans.push_back(ans.back());
cur_sum += dlt;
all_dlt += dlt;
} else {
auto [sz1, sz2] = ett.cut_edge(u, v);
int64_t dlt = int64_t(sz1) * sz2;
cur_sum -= dlt;
ans.push_back({cur_sum - all_dlt});
}
}
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 3
Accepted
time: 0ms
memory: 3840kb
input:
0 1 147 3 0 3 0 3 1 3 1 3 0 3 5 3 5 3 1 3 1 3 4 3 8 3 2 3 10 3 13 3 10 3 8 3 8 3 0 3 16 3 3 3 1 3 20 3 2 3 10 3 16 3 13 3 17 3 12 3 22 3 7 3 8 3 2 3 12 3 32 3 12 3 31 3 2 3 0 3 21 3 24 3 28 3 32 3 9 3 18 3 26 3 11 3 45 3 35 3 14 3 34 3 49 3 31 3 43 3 11 3 21 3 50 3 4 3 11 3 31 3 51 3 28 3 26 3 18 3 ...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 147 lines
Test #2:
score: 0
Accepted
time: 0ms
memory: 3560kb
input:
0 2 10 1 1 2 3 1 3 1 3 2 3 3 3 3 3 3 2 1 2 3 2 3 3
output:
1 1 1 1 1 1 1 1
result:
ok 8 lines
Test #3:
score: -3
Wrong Answer
time: 0ms
memory: 3564kb
input:
0 30 150 1 14 10 3 1 1 14 6 1 3 6 3 4 3 4 1 2 3 3 0 3 5 1 2 9 1 11 9 3 8 1 19 11 3 6 1 8 19 3 14 3 10 1 27 8 3 15 1 27 28 1 28 20 3 0 3 3 1 20 7 1 7 23 3 13 3 5 1 24 23 3 0 3 28 1 24 13 3 5 3 32 3 1 3 13 1 30 13 3 25 1 30 16 1 15 16 3 22 1 29 15 3 13 1 29 25 1 25 1 1 1 18 3 17 3 8 3 10 1 26 18 3 46 ...
output:
1 6 6 10 10 21 28 36 36 45 66 66 91 91 105 105 120 120 120 120 136 171 190 253 253 253 276 276 300 300 300 325 351 351 351 351 406 406 435 435 435 435 435 392 435 435 435 234 435 435 392 435 435 -10 435 70 435 435 435 -10 392 -56 -34 -10 -34 435 435 164 435 -114 435 435 435 -77 435 435 -170 435 -130...
result:
wrong answer 44th lines differ - expected: '406', found: '392'
Subtask #2:
score: 0
Runtime Error
Test #29:
score: 2
Accepted
time: 0ms
memory: 3628kb
input:
1 1 147 3 0 3 0 3 1 3 1 3 3 3 0 3 6 3 6 3 0 3 2 3 0 3 5 3 12 3 1 3 2 3 10 3 13 3 15 3 3 3 12 3 20 3 18 3 10 3 12 3 2 3 12 3 14 3 26 3 12 3 24 3 7 3 7 3 6 3 29 3 32 3 16 3 23 3 14 3 25 3 13 3 13 3 31 3 20 3 26 3 0 3 40 3 23 3 28 3 35 3 1 3 31 3 2 3 34 3 37 3 3 3 39 3 17 3 4 3 41 3 11 3 16 3 48 3 10 3...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 147 lines
Test #30:
score: 0
Accepted
time: 0ms
memory: 3560kb
input:
1 2 10 1 1 2 3 1 3 1 3 1 3 1 3 1 3 2 3 6 2 0 3 3 2
output:
1 1 1 1 1 1 1 1
result:
ok 8 lines
Test #31:
score: -2
Runtime Error
input:
1 30 150 1 21 13 3 1 1 9 20 3 2 3 2 1 18 11 1 18 0 3 6 3 9 3 8 1 12 9 3 8 3 7 1 10 9 3 5 3 24 3 26 3 28 1 6 16 3 6 3 14 1 15 23 3 21 3 48 1 60 47 3 53 3 37 1 35 53 3 56 1 57 59 1 59 37 3 63 3 95 3 94 1 92 79 3 65 1 90 81 1 95 81 3 75 3 111 3 118 3 100 1 124 98 1 101 98 3 121 3 132 3 137 3 153 1 141 ...
output:
result:
Subtask #3:
score: 0
Skipped
Dependency #1:
0%
Subtask #4:
score: 0
Skipped
Dependency #2:
0%
Subtask #5:
score: 0
Skipped
Dependency #3:
0%
Subtask #6:
score: 0
Skipped
Dependency #4:
0%
Subtask #7:
score: 0
Skipped
Dependency #6:
0%