Skip to content

Commit 6d36a0e

Browse files
committed
final golf
1 parent 3059b7f commit 6d36a0e

File tree

1 file changed

+9
-12
lines changed

1 file changed

+9
-12
lines changed

library/trees/ladder_decomposition/linear_kth_par.hpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
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*(2*KAPPA+1)/(KAPPA-1) + n*2*(KAPPA-1) + q)
14-
//! @space O(n*(2*KAPPA+1)/(KAPPA-1) + n*2*(KAPPA-1))
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)))
1515
template<int KAPPA = 3> struct linear_kth_par {
1616
int n;
1717
vi d, leaf, pos, jmp;
@@ -26,24 +26,21 @@ template<int KAPPA = 3> struct linear_kth_par {
2626
t++;
2727
};
2828
auto dfs = [&](auto&& self, int v, int p) -> void {
29-
st[d[v]] = leaf[v] = v;
29+
st[d[v]] = v;
30+
int& l = leaf[v] = v;
3031
pos[v] = t;
3132
calc(d[v]);
3233
for (int u : adj[v])
3334
if (u != p) {
3435
d[u] = 1 + d[v];
3536
self(self, u, v);
36-
if (d[leaf[v]] < d[leaf[u]]) leaf[v] = leaf[u];
37+
if (d[l] < d[leaf[u]]) l = leaf[u];
3738
calc(d[v]);
3839
}
39-
// TODO golf this further
40-
int len = (d[leaf[v]] - d[v]) * (2 * KAPPA + 1) /
41-
(KAPPA - 1);
42-
len = max(len, 2 * (KAPPA - 1));
43-
int i = d[leaf[v]] - sz(lad[leaf[v]]);
44-
while (i && sz(lad[leaf[v]]) < len)
45-
lad[leaf[v]].push_back(st[i--]);
46-
assert(lad[leaf[v]].back() > 0);
40+
int s =
41+
(d[l] - d[v]) * (2 * KAPPA + 1) / (KAPPA - 1);
42+
s = min(max(s, 2 * (KAPPA - 1)), d[l] + 1);
43+
rep(i, sz(lad[l]), s) lad[l].push_back(st[d[l] - i]);
4744
};
4845
dfs(dfs, 0, 0);
4946
}

0 commit comments

Comments
 (0)