LCA投票
lca投票是一种用于树状结构中找到最近公共祖先(lca)的算法。在一些应用场景下,需要对n个节点进行m次询问,每次询问给出两个节点x和y,并询问它们的最近公共祖先。lca投票的时间复杂度为o(n+m),效率较高,因此广泛应用于各种算法竞赛等场合。
lca投票的过程如下:从任意一个节点开始,通过dfs的方法遍历整个树,并记录每个节点的深度值和其在dfs遍历顺序中首次出现的位置。然后,对于每个询问(x,y)。我们可以先比较它们首次出现的位置,如果x位于y的前面,则交换x和y。接下来,从y开始向上跳,直到找到一个节点p,使得p是x的祖先,并且深度值最小。然后,在向上跳的过程中,对于每个经过的节点i,都记录下它的“候选祖先”q[i]。最终,从x开始向上跳,直到找到p,这样就得到了x和y的最近公共祖先。最后,利用“候选祖先”和深度值信息,可以快速确定lca的实际位置,并计算出其他相关的统计信息,例如lca在dfs序列中的位置或深度值等。