Skip to content

Commit 854f12e

Browse files
committed
nits/golf
1 parent 2cb38e3 commit 854f12e

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

library/dsu/range_parallel_dsu.hpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,17 @@
77
//! @space O(n log n)
88
struct rp_dsu {
99
vector<DSU> dsus;
10-
rp_dsu(int n): dsus(bit_width(unsigned(n)), DSU(n)) {}
10+
rp_dsu(int n): dsus(bit_width(n + 0u), DSU(n)) {}
1111
void join(int u, int v, int len, const auto& f) {
1212
int i = __lg(len);
1313
join(u, v, f, i);
1414
join(u + len - (1 << i), v + len - (1 << i), f, i);
1515
}
1616
void join(int u, int v, const auto& f, int i) {
17-
if (i == 0) {
18-
u = dsus[0].f(u);
19-
v = dsus[0].f(v);
20-
if (!dsus[0].join(v, u)) return;
21-
int w = dsus[0].f(u);
22-
return f(w, u ^ v ^ w);
23-
}
2417
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);
18+
if (i == 0) return f(u, v);
19+
i--;
20+
join(u, v, f, i);
21+
join(u + (1 << i), v + (1 << i), f, i);
2722
}
2823
};

tests/library_checker_aizu_tests/dsu/range_parallel_dsu.test.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,26 @@ int main() {
99
cin.tie(0)->sync_with_stdio(0);
1010
int n, q;
1111
cin >> n >> q;
12-
rp_dsu dsu(n);
12+
rp_dsu r_dsu(n);
1313
vi y(n);
1414
for (int i = 0; i < n; i++) cin >> y[i];
1515
vi x = y;
1616
int ans = 0;
17+
DSU dsu(n);
1718
auto f = [&](int u, int v) {
18-
ans = (ans + 1LL * x[u] * x[v]) % mod;
19-
x[u] = (x[u] + x[v]) % mod;
19+
u = dsu.f(u);
20+
v = dsu.f(v);
21+
assert(dsu.join(u, v));
22+
int root = dsu.f(u);
23+
int other = root ^ u ^ v;
24+
ans = (ans + 1LL * x[root] * x[other]) % mod;
25+
x[root] = (x[root] + x[other]) % mod;
2026
};
2127
vector<vector<pii>> joins(n + 1);
2228
for (int qq = 0; qq < q; qq++) {
2329
int k, a, b;
2430
cin >> k >> a >> b;
25-
if (k) dsu.join(a, b, k, f);
31+
if (k) r_dsu.join(a, b, k, f);
2632
joins[k].emplace_back(a, b);
2733
cout << ans << '\n';
2834
if (qq == 0 || qq == 1 || qq == 10 || qq == 1000 ||

0 commit comments

Comments
 (0)