File tree 1 file changed +11
-12
lines changed
1 file changed +11
-12
lines changed Original file line number Diff line number Diff line change 1
1
// Lowest Common Ancestor by binary lifting
2
2
// https://youtu.be/8uowVvQ_-Mo?t=4306
3
- template <typename T> // T: type of cost
3
+ template <typename T= int > // T: type of cost
4
4
struct lca {
5
5
int n, root, l;
6
6
vector<vector<int >> to;
@@ -38,30 +38,29 @@ struct lca {
38
38
}
39
39
}
40
40
// LCA
41
- int operator ()(int a, int b) {
42
- if (dep[a] > dep[b]) swap (a,b);
43
- int gap = dep[b]-dep[a];
41
+ int up (int v, int k) {
44
42
for (int i = l-1 ; i >= 0 ; --i) {
45
43
int len = 1 <<i;
46
- if (gap >= len) {
47
- gap -= len;
48
- b = par[b][i];
49
- }
44
+ if (k >= len) k -= len, v = par[v][i];
50
45
}
46
+ return v;
47
+ }
48
+ int operator ()(int a, int b) {
49
+ if (dep[a] > dep[b]) swap (a,b);
50
+ b = up (b, dep[b]-dep[a]);
51
51
if (a == b) return a;
52
52
for (int i = l-1 ; i >= 0 ; --i) {
53
- int na = par[a][i];
54
- int nb = par[b][i];
53
+ int na = par[a][i], nb = par[b][i];
55
54
if (na != nb) a = na, b = nb;
56
55
}
57
56
return par[a][0 ];
58
57
}
59
58
int length (int a, int b) {
60
- int c = lca (a,b);
59
+ int c = (* this ) (a,b);
61
60
return dep[a]+dep[b]-dep[c]*2 ;
62
61
}
63
62
T dist (int a, int b) {
64
- int c = lca (a,b);
63
+ int c = (* this ) (a,b);
65
64
return costs[a]+costs[b]-costs[c]*2 ;
66
65
}
67
66
};
You can’t perform that action at this time.
0 commit comments