Skip to content

Commit b9ac2cf

Browse files
committed
lots of nits
1 parent 99c9cd2 commit b9ac2cf

9 files changed

Lines changed: 33 additions & 33 deletions

library/dsu/kruskal_tree.hpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@ struct kr_tree {
77
vi p;
88
vector<vi> adj;
99
kr_tree(int n): id(n), p(2 * n, -1), adj(2 * n) {}
10-
int find(int v) {
11-
return p[v] < 0 ? v : p[v] = find(p[v]);
12-
}
10+
int f(int v) { return p[v] < 0 ? v : p[v] = f(p[v]); }
1311
bool join(int u, int v) {
14-
if ((u = find(u)) == (v = find(v))) return 0;
12+
if ((u = f(u)) == (v = f(v))) return 0;
1513
return adj[p[u] = p[v] = id++] = {u, v}, 1;
1614
}
1715
};

library/dsu/range_parallel_dsu.hpp

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,28 @@
11
#pragma once
22
#include "dsu.hpp"
3-
//! Given l1,l2,len; joins (l1,l2), (l1+1,l2+1),
4-
//! ..., (l1+len-1,l2+len-1)
3+
//! Given u,v,len; joins (u,v), (u+1,v+1),
4+
//! ..., (u+len-1,v+len-1)
55
//! `f` is called at most n-1 times
66
//! @time O(n*log(n)*\alpha(n) + q)
77
//! @space O(n log n)
88
struct rp_dsu {
99
vector<DSU> dsus;
1010
rp_dsu(int n): dsus(bit_width(unsigned(n)), DSU(n)) {}
11-
void join(int l1, int l2, int len, const auto& f) {
12-
if (len == 0) return;
13-
int lg = __lg(len);
14-
join_impl(lg, l1, l2, f);
15-
join_impl(lg, l1 + len - (1 << lg),
16-
l2 + len - (1 << lg), f);
11+
void join(int u, int v, int len, const auto& f) {
12+
int i = __lg(len);
13+
join(u, v, f, i);
14+
join(u + len - (1 << i), v + len - (1 << i), f, i);
1715
}
18-
void join_impl(int lvl, int u, int v, const auto& f) {
19-
if (lvl == 0) {
16+
void join(int u, int v, const auto& f, int i) {
17+
if (i == 0) {
2018
u = dsus[0].f(u);
2119
v = dsus[0].f(v);
2220
if (!dsus[0].join(v, u)) return;
2321
int w = dsus[0].f(u);
2422
return f(w, u ^ v ^ w);
2523
}
26-
if (!dsus[lvl].join(u, v)) return;
27-
join_impl(lvl - 1, u, v, f);
28-
join_impl(lvl - 1, u + (1 << (lvl - 1)),
29-
v + (1 << (lvl - 1)), f);
24+
if (!dsus[i].join(u, v)) return;
25+
join(u, v, f, i - 1);
26+
join(u + (1 << (i - 1)), v + (1 << (i - 1)), f, i - 1);
3027
}
3128
};
Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
#pragma once
22
#include "dsu.hpp"
3-
//! Given triplets (l1,l2,len); joins (l1,l2),
4-
//! (l1+1,l2+1), ..., (l1+len-1,l2+len-1)
3+
//! @code
4+
//! vector<vector<pii>> joins(n + 1);
5+
//! joins[len].emplace_back(u, v);
6+
//! // it does:
7+
//! // dsu.join(u + 0, v + 0);
8+
//! // dsu.join(u + 1, v + 1);
9+
//! // dsu.join(u + 2, v + 2);
10+
//! // ...
11+
//! // dsu.join(u + len - 1, v + len - 1);
12+
//! DSU dsu = get_rp_dsu(joins, n);
13+
//! @endcode
514
//! @time O((n + q) * \alpha(n))
615
//! @space O(n + q)
7-
DSU get_rp_dsu(const vector<array<int, 3>>& rests, int n) {
8-
vector<vector<pii>> rests_by_len(n + 1);
9-
for (auto [l1, l2, len] : rests)
10-
rests_by_len[len].emplace_back(l1, l2);
16+
DSU get_rp_dsu(vector<vector<pii>>& joins, int n) {
1117
DSU dsu(n);
12-
for (int len = n; len > 0; len--)
13-
for (auto [l1, l2] : rests_by_len[len])
14-
if (dsu.join(l1, l2))
15-
rests_by_len[len - 1].emplace_back(l1 + 1, l2 + 1);
18+
for (int i = n; i; i--)
19+
for (auto [u, v] : joins[i])
20+
if (dsu.join(u, v))
21+
joins[i - 1].emplace_back(u + 1, v + 1);
1622
return dsu;
1723
}

tests/library_checker_aizu_tests/data_structures/dsu.test.cpp renamed to tests/library_checker_aizu_tests/dsu/dsu.test.cpp

File renamed without changes.

tests/library_checker_aizu_tests/data_structures/dsu_bipartite.test.cpp renamed to tests/library_checker_aizu_tests/dsu/dsu_bipartite.test.cpp

File renamed without changes.

tests/library_checker_aizu_tests/data_structures/kruskal_tree_aizu.test.cpp renamed to tests/library_checker_aizu_tests/dsu/kruskal_tree_aizu.test.cpp

File renamed without changes.

tests/library_checker_aizu_tests/data_structures/line_tree_aizu.test.cpp renamed to tests/library_checker_aizu_tests/dsu/line_tree_aizu.test.cpp

File renamed without changes.

tests/library_checker_aizu_tests/data_structures/line_tree_lib_checker.test.cpp renamed to tests/library_checker_aizu_tests/dsu/line_tree_lib_checker.test.cpp

File renamed without changes.

tests/library_checker_aizu_tests/data_structures/range_parallel_dsu.test.cpp renamed to tests/library_checker_aizu_tests/dsu/range_parallel_dsu.test.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,16 @@ int main() {
1818
ans = (ans + 1LL * x[u] * x[v]) % mod;
1919
x[u] = (x[u] + x[v]) % mod;
2020
};
21-
vector<array<int, 3>> queries;
22-
queries.reserve(q);
21+
vector<vector<pii>> joins(n + 1);
2322
for (int qq = 0; qq < q; qq++) {
2423
int k, a, b;
2524
cin >> k >> a >> b;
26-
dsu.join(a, b, k, f);
27-
queries.push_back({a, b, k});
25+
if (k) dsu.join(a, b, k, f);
26+
joins[k].emplace_back(a, b);
2827
cout << ans << '\n';
2928
if (qq == 0 || qq == 1 || qq == 10 || qq == 1000 ||
3029
qq == 100'000 || qq == q - 1) {
31-
auto uf = get_rp_dsu(queries, n);
30+
auto uf = get_rp_dsu(joins, n);
3231
vi sums(n);
3332
int offline_ans = 0;
3433
for (int i = 0; i < n; i++) {

0 commit comments

Comments
 (0)