RMQ求LCA
RMQ求LCA
用RMQ可以实现O(n)求树上两点的LCA。
记录一个S数组,每次DFS到某个点的时候就加入S数组,“到”并不是指DFS那种第一次“到”,是每次都加入。可以证明最终S数组内会有2n+1个数。
再记一个数组P,Pi表示Si在树中的深度是Pi。
举个栗子:
然后记Firsti表示i结点在S中第一次出现的位置。
对于一个询问(x,y),它们的LCA就是[Firstx,Firsty]中深度最小的结点。
正确性:[Firstx,Firsty]中深度小于x,y的点都在x→y的路径上,而深度最小的那个点就必然是LCA了。
欢迎转载,转载请注明出处!