|
7 | 7 | //! } |
8 | 8 | //! vector<basic_string<int>> adj(n); |
9 | 9 | //! tree_lift tree_l(adj); |
10 | | -//! int kth_p = tree_l.kth_par(v, k); |
| 10 | +//! tree_l.kth_par(v, k); // k edges up from v |
11 | 11 | //! @endcode |
12 | | -//! kth_p = a node k edges up from v |
13 | 12 | //! @time O(n + q log n) |
14 | 13 | //! @space O(n) |
15 | 14 | struct tree_lift { |
16 | | - struct node { |
17 | | - int d, p = -1, j = -1; |
18 | | - }; |
19 | | - vector<node> t; |
20 | | - tree_lift(const auto& adj): t(sz(adj)) { |
| 15 | + vi d, p, j; |
| 16 | + tree_lift(const auto& adj): d(sz(adj)), p(d), j(d) { |
21 | 17 | auto dfs = [&](auto&& self, int v) -> void { |
22 | | - int jump = |
23 | | - (t[v].d + t[t[t[v].j].j].d == 2 * t[t[v].j].d) |
24 | | - ? t[t[v].j].j |
25 | | - : v; |
| 18 | + int up = |
| 19 | + d[v] + d[j[j[v]]] == 2 * d[j[v]] ? j[j[v]] : v; |
26 | 20 | for (int u : adj[v]) |
27 | | - if (u != t[v].p) |
28 | | - t[u].d = t[t[u].p = v].d + 1, t[u].j = jump, |
29 | | - self(self, u); |
| 21 | + if (u != p[v]) |
| 22 | + d[u] = d[p[u] = v] + 1, j[u] = up, self(self, u); |
30 | 23 | }; |
31 | | - rep(i, 0, sz(t)) if (t[i].j == -1) t[i].j = i, |
32 | | - dfs(dfs, i); |
| 24 | + dfs(dfs, 0); |
33 | 25 | } |
34 | 26 | int kth_par(int v, int k) { |
35 | | - int anc_d = t[v].d - k; |
36 | | - while (t[v].d > anc_d) |
37 | | - v = t[t[v].j].d >= anc_d ? t[v].j : t[v].p; |
| 27 | + int anc_d = d[v] - k; |
| 28 | + while (d[v] > anc_d) |
| 29 | + v = d[j[v]] >= anc_d ? j[v] : p[v]; |
38 | 30 | return v; |
39 | 31 | } |
40 | 32 | int lca(int u, int v) { |
41 | | - if (t[u].d < t[v].d) swap(u, v); |
42 | | - u = kth_par(u, t[u].d - t[v].d); |
| 33 | + if (d[u] < d[v]) swap(u, v); |
| 34 | + u = kth_par(u, d[u] - d[v]); |
43 | 35 | while (u != v) |
44 | | - if (t[u].j != t[v].j) u = t[u].j, v = t[v].j; |
45 | | - else u = t[u].p, v = t[v].p; |
| 36 | + if (j[u] != j[v]) u = j[u], v = j[v]; |
| 37 | + else u = p[u], v = p[v]; |
46 | 38 | return u; |
47 | 39 | } |
48 | 40 | #include "../extra_members/dist_edges.hpp" |
|
0 commit comments