QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#523302 | #8809. Telephone Plans | lwm7708 | 0 | 0ms | 3888kb | C++17 | 4.7kb | 2024-08-18 04:00:52 | 2024-08-18 04:00:52 |
answer
#include <algorithm>
#include <cstdint>
#include <ios>
#include <iostream>
#include <numeric>
#include <set>
#include <utility>
#include <vector>
void solve() {
bool e;
std::int32_t n;
std::int32_t q;
std::cin >> e >> n >> q;
std::vector<std::set<std::int32_t>> adj(n);
std::vector<std::int32_t> comps(n);
std::vector<std::set<std::int32_t>> grps(n);
std::vector<std::int32_t> pars(n);
std::vector<std::int64_t> pfxs(q + 1);
std::int64_t prv = 0;
std::int64_t tot_pairs = 0;
std::iota(std::begin(comps), std::end(comps), 0);
for (std::int32_t i = 0; i < n; ++i) {
grps[i].insert(i);
}
for (std::int32_t i = 0; i < q; ++i) {
pfxs[i + 1] = pfxs[i];
std::int32_t tp = 0;
std::cin >> tp;
if (tp == 1) {
std::int64_t x;
std::int64_t y;
std::cin >> x >> y;
if (e) {
x ^= prv;
y ^= prv;
}
--x;
--y;
adj[x].insert(y);
adj[y].insert(x);
x = comps[x];
y = comps[y];
const std::int64_t sz_1 = std::size(grps[x]);
const std::int64_t sz_2 = std::size(grps[y]);
tot_pairs += sz_1 * sz_2;
if (sz_1 < sz_2) {
std::swap(x, y);
}
for (auto z : grps[y]) {
comps[z] = x;
}
grps[x].merge(grps[y]);
} else if (tp == 2) {
std::int64_t x;
std::int64_t y;
std::cin >> x >> y;
if (e) {
x ^= prv;
y ^= prv;
}
--x;
--y;
adj[x].erase(y);
adj[y].erase(x);
pars[x] = -1;
pars[y] = -1;
std::set<std::int32_t>& grp = grps[comps[x]];
std::vector proc_1({std::int32_t(x)});
std::vector proc_2({std::int32_t(y)});
bool swp = false;
std::int64_t sz_1 = 1;
std::int64_t sz_2 = 1;
if (!std::empty(adj[x]) && !std::empty(adj[y])) {
using it_t = std::set<std::int32_t>::iterator;
it_t it_1;
it_t it_2;
std::int32_t ptr_1 = -1;
std::int32_t ptr_2 = -1;
while (true) {
while (ptr_1 < sz_1) {
if (ptr_1 == -1 || it_1 == std::end(adj[proc_1[ptr_1]])) {
++ptr_1;
it_1 = std::begin(adj[proc_1[ptr_1]]);
continue;
}
if (*it_1 != pars[proc_1[ptr_1]]) {
break;
}
++it_1;
}
if (ptr_1 < sz_1) {
proc_1.push_back(*it_1);
++sz_1;
} else {
break;
}
while (ptr_2 < sz_2) {
if (ptr_2 == -1 || it_2 == std::end(adj[proc_2[ptr_2]])) {
++ptr_2;
it_2 = std::begin(adj[proc_2[ptr_2]]);
continue;
}
if (*it_2 != pars[proc_2[ptr_2]]) {
break;
}
++it_2;
}
if (ptr_2 < sz_2) {
proc_2.push_back(*it_2);
++sz_2;
} else {
swp = true;
break;
}
}
} else if (std::empty(adj[x])) {
swp = true;
}
const std::int64_t mn_sz = std::min(sz_1, sz_2);
pfxs[i + 1] += mn_sz * (std::size(grp) - mn_sz);
if (swp) {
std::swap(proc_1, proc_2);
}
for (auto z : proc_2) {
grp.erase(z);
comps[z] = std::size(grps);
}
grps.emplace_back(std::begin(proc_2), std::end(proc_2));
} else {
std::int64_t t;
std::cin >> t;
if (e) {
t ^= prv;
}
prv = tot_pairs - pfxs[i - t];
std::cout << prv << '\n';
}
}
}
int main() {
std::cin.tie(nullptr);
std::ios_base::sync_with_stdio(false);
solve();
return 0;
}
详细
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 3
Accepted
time: 0ms
memory: 3680kb
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: 3
Accepted
time: 0ms
memory: 3580kb
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: 0
Wrong Answer
time: 0ms
memory: 3888kb
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 406 435 435 435 300 435 435 435 435 435 153 435 190 435 435 435 136 406 120 120 136 120 435 435 276 435 66 435 435 435 91 435 435 28 435 55 55 43...
result:
wrong answer 51st lines differ - expected: '406', found: '435'
Subtask #2:
score: 0
Runtime Error
Test #29:
score: 2
Accepted
time: 0ms
memory: 3620kb
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: 2
Accepted
time: 0ms
memory: 3880kb
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: 0
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%