100分(WA)LCA 求调

P3379 【模板】最近公共祖先(LCA)

@[2022_37_yzyUUU](/user/785636) LCA 要用倍增跳
by szh_AK_all @ 2024-04-13 09:38:12


@[szh_AK_all](/user/939431) 能具体说一下吗?
by 2022_37_yzyUUU @ 2024-04-13 09:42:37


@[2022_37_yzyUUU](/user/785636) 这个其实是个板子。 用 f[x][i] 记录 x 向上 $2_i$ 步的父亲,那么有 f[x][i]=f[f[x][i-1]][i-1]. 然后跳 LCA 的时候不断倍增跳就行,一次跳一步很慢。 ```cpp 记录父亲 fa[x][0] = f; de[x] = de[f] + 1; for (int i = 1; i <= 25; i++) fa[x][i] = fa[fa[x][i - 1]][i - 1]; ..... 跳 LCA int lca(int x, int y) { if (de[x] < de[y]) swap(x, y); for (int i = 25; i >= 0; i--) if (de[fa[x][i]] >= de[y]) x = fa[x][i]; if (x == y) return x; for (int i = 25; i >= 0; i--) if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i]; return fa[x][0]; } ```
by szh_AK_all @ 2024-04-13 09:45:14


@[szh_AK_all](/user/939431) 万分感谢
by 2022_37_yzyUUU @ 2024-04-13 09:48:05


智瑶nb
by ask666UU @ 2024-04-13 09:54:22


智瑶nb
by 0xllllllllllf @ 2024-04-13 09:58:10


智瑶nb
by zhuxiangruicn @ 2024-04-18 18:19:36


|