Skip to content

Commit eb0d626

Browse files
committed
final nits
1 parent ce8dc25 commit eb0d626

File tree

2 files changed

+11
-12
lines changed

2 files changed

+11
-12
lines changed

library/trees/ladder_decomposition/linear_kth_par.hpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,19 @@
1010
//! kp.kth_par(v, k); // k edges up from v
1111
//! kp.kth_par(v, 1); // v's parent
1212
//! @endcode
13-
//! @time O(n*max((2*KAPPA+1)/(KAPPA-1),2*(KAPPA-1)) + q)
14-
//! @space O(n*max((2*KAPPA+1)/(KAPPA-1),2*(KAPPA-1)))
15-
template<int KAPPA = 3> struct linear_kth_par {
13+
//! @time O(n*max((2*KAPPA+3)/KAPPA,2*KAPPA) + q)
14+
//! @space O(n*max((2*KAPPA+3)/KAPPA,2*KAPPA))
15+
template<int KAPPA = 2> struct linear_kth_par {
1616
int n;
1717
vi d, leaf, pos, jmp;
1818
vector<vi> lad;
1919
linear_kth_par(const auto& adj):
2020
n(sz(adj)), d(n), leaf(n), pos(n), jmp(2 * n), lad(n) {
21-
static_assert(KAPPA >= 2);
21+
static_assert(KAPPA >= 1);
2222
int t = 1;
2323
vi st(n);
2424
auto calc = [&](int siz) {
25-
jmp[t] = st[max(0, siz - (KAPPA - 1) * (t & -t))];
25+
jmp[t] = st[max(0, siz - KAPPA * (t & -t))];
2626
t++;
2727
};
2828
auto dfs = [&](auto&& self, int v, int p) -> void {
@@ -37,17 +37,16 @@ template<int KAPPA = 3> struct linear_kth_par {
3737
if (d[l] < d[leaf[u]]) l = leaf[u];
3838
calc(d[v]);
3939
}
40-
int s =
41-
(d[l] - d[v]) * (2 * KAPPA + 1) / (KAPPA - 1);
42-
s = min(max(s, 2 * (KAPPA - 1)), d[l] + 1);
40+
int s = (d[l] - d[v]) * (2 * KAPPA + 3) / KAPPA;
41+
s = min(max(s, 2 * KAPPA), d[l] + 1);
4342
rep(i, sz(lad[l]), s) lad[l].push_back(st[d[l] - i]);
4443
};
4544
dfs(dfs, 0, 0);
4645
}
4746
int kth_par(int v, int k) {
4847
assert(0 <= k && k <= d[v]);
4948
int j = v;
50-
if (unsigned b = k / KAPPA; b)
49+
if (unsigned b = k / (KAPPA + 1); b)
5150
b = bit_floor(b), j = jmp[(pos[v] & -b) | b];
5251
return j = leaf[j], lad[j][k + d[j] - d[v]];
5352
}

tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@ int main() {
1717
adj[v].push_back(u);
1818
}
1919
linear_lca lin_lca(adj);
20+
linear_kth_par<1> lin_kp_1(adj);
2021
linear_kth_par<2> lin_kp_2(adj);
2122
linear_kth_par<3> lin_kp_3(adj);
2223
linear_kth_par<4> lin_kp_4(adj);
23-
linear_kth_par<5> lin_kp_5(adj);
2424
LCA lc(adj);
2525
compress_tree_asserts(adj, lc);
2626
auto get_kth_par = [&](int v, int k) -> int {
27-
int res = lin_kp_2.kth_par(v, k);
27+
int res = lin_kp_1.kth_par(v, k);
28+
assert(res == lin_kp_2.kth_par(v, k));
2829
assert(res == lin_kp_3.kth_par(v, k));
2930
assert(res == lin_kp_4.kth_par(v, k));
30-
assert(res == lin_kp_5.kth_par(v, k));
3131
return res;
3232
};
3333
while (q--) {

0 commit comments

Comments
 (0)