Loading docs/graph/lca.md +1 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ 现在我们看看如何优化这些跳转: 在调整游标的第一阶段中,我们要将 $u,v$ 两点跳转到同一深度。我们可以计算出 $u,v$ 两点的深度之差,设其为 $y$ 。通过将 $y$ 进行二进制拆分,我们将 $y$ 次游标跳转优化为「 $y$ 的二进制表示所含 `1` 的个数」次游标跳转。 在第二阶段中,我们从最大的 $i$ 开始循环尝试,一直尝试到 $0$ (包括 $0$ ),如果 $fa_{u,i}\not=fa_{v,i}$ ,则 $u\gets fa_{u,i},v\gets fa_{v,i}$ ,那么最后的 LCA 为 `fa[u][0]` 。 在第二阶段中,我们从最大的 $i$ 开始循环尝试,一直尝试到 $0$ (包括 $0$ ),如果 $fa_{u,i}\not=fa_{v,i}$ ,则 $u\gets fa_{u,i},v\gets fa_{v,i}$ ,那么最后的 LCA 为 $fa_{u,0}$ 。 倍增算法的预处理时间复杂度为 $O(n \log n)$ ,单次查询时间复杂度为 $O(\log n)$ 。 另外倍增算法可以通过交换 `fa` 数组的两维使较小维放在前面。这样可以减少 cache miss 次数,提高程序效率。 Loading Loading
docs/graph/lca.md +1 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ 现在我们看看如何优化这些跳转: 在调整游标的第一阶段中,我们要将 $u,v$ 两点跳转到同一深度。我们可以计算出 $u,v$ 两点的深度之差,设其为 $y$ 。通过将 $y$ 进行二进制拆分,我们将 $y$ 次游标跳转优化为「 $y$ 的二进制表示所含 `1` 的个数」次游标跳转。 在第二阶段中,我们从最大的 $i$ 开始循环尝试,一直尝试到 $0$ (包括 $0$ ),如果 $fa_{u,i}\not=fa_{v,i}$ ,则 $u\gets fa_{u,i},v\gets fa_{v,i}$ ,那么最后的 LCA 为 `fa[u][0]` 。 在第二阶段中,我们从最大的 $i$ 开始循环尝试,一直尝试到 $0$ (包括 $0$ ),如果 $fa_{u,i}\not=fa_{v,i}$ ,则 $u\gets fa_{u,i},v\gets fa_{v,i}$ ,那么最后的 LCA 为 $fa_{u,0}$ 。 倍增算法的预处理时间复杂度为 $O(n \log n)$ ,单次查询时间复杂度为 $O(\log n)$ 。 另外倍增算法可以通过交换 `fa` 数组的两维使较小维放在前面。这样可以减少 cache miss 次数,提高程序效率。 Loading