看到一个神奇的LCA写法
void pre(int u, int fa) {
d[u] = d[fa] + 1, ff[u][0] = fa;
for (int i = 1; i <= lg[d[u]] + 1; ++i) ff[u][i] = ff[ff[u][i - 1]][i - 1];
for (int v: e[u]) if (v != fa) pre(v, u);
}
int lca(int x, int y) {
if (d[x] < d[y]) swap(x, y);
while (d[x] > d[y]) x = ff[x][lg[d[x] - d[y]] - 1];
if (x == y) return x;
for (int k = lg[d[x]] + 1; k >= 0; --k) if (ff[x][k] != ff[y][k]) x = ff[x][k], y = ff[y][k];
return ff[x][0];
}
蒟蒻测过不对,但有没有大佬可以指出哪里不对