QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#523328 | #8809. Telephone Plans | lwm7708 | 0 | 0ms | 3640kb | C++17 | 3.6kb | 2024-08-18 07:01:23 | 2024-08-18 07:01:24 |
answer
#include <cassert>
#include <cstdint>
#include <ios>
#include <iostream>
#include <numeric>
#include <set>
#include <utility>
#include <vector>
template <typename F>
class y_combinator {
private:
F f;
public:
explicit y_combinator(F&& f) : f(f) {}
template <typename... Args>
decltype(auto) operator()(Args&&... args) const {
return f(*this, std::forward<Args>(args)...);
}
};
template <typename F>
y_combinator(F) -> y_combinator<F>;
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::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]);
assert(std::empty(grps[y]));
} else if (tp == 2) {
using grp_t = std::vector<std::int32_t>;
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);
const auto dfs = y_combinator(
[&](auto self, std::int32_t node, std::int32_t par, grp_t& grp) -> void {
grp.push_back(node);
for (auto x : adj[node]) {
if (x != par) {
self(x, node, grp);
}
}
}
);
std::set<std::int32_t>& grp = grps[comps[x]];
grp_t grp_1;
grp_t grp_2;
dfs(x, -1, grp_1);
dfs(y, -1, grp_2);
const std::int64_t sz_1 = std::size(grp_1);
const std::int64_t sz_2 = std::size(grp_2);
assert(sz_1 + sz_2 == std::int32_t(std::size(grp)));
pfxs[i + 1] += sz_1 * sz_2;
if (sz_1 < sz_2) {
std::swap(grp_1, grp_2);
}
for (auto z : grp_2) {
assert(grp.erase(z) == 1);
comps[z] = std::size(grps);
}
grps.emplace_back(std::begin(grp_2), std::end(grp_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: 3612kb
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: 3536kb
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: 3596kb
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: 3640kb
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: 3640kb
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%