LCT&Tarjan算法解决LCA问题&ST算法解决RMQ问题

先复习一下RMQ(ST算法)

RMQ问题背景
给出一个序列,然后求子区间的最大最小值

m次查询,长度为n
暴力搜:O(mn)
线段树树形结构维护区间最值O(n
logn)
ST算法:预处理的O(n*logn+q)

//
//  main.cpp
//  RMQ复习
//
//  Created by 陈冉飞 on 2019/9/18.
//  Copyright © 2019 陈冉飞. All rights reserved.
//

/*解决方法:ST算法*/
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;

#define max_length 100100
int max_num[max_length][20];
int min_num[max_length][20];

int main(){
    int n;
    scanf("%d",&n);
    int tem;
    //第一部分的预处理,也可以理解为输入,此时找的是长度为1的区间的最值,也就是本身,后面的部分是找区间为2 4 8……的长度的区间的最值
    for (int i = 0; i < n; i++) {
        scanf("%d",&tem);
        max_num[i][0] = tem;
        min_num[i][0] = tem;
    }
    //第二部分预处理
    for (int j = 1; (1<<j) <= n; j++) {
        for (int i = 1; i+(1<<j)-1 <= n; i++) {
            //看前后两个区间的最值           j-1 就是二进制前走一位,也就是区间的长度变成一半,然后比较区间最值的时候,不同的地方是起点。
            max_num[i][j] = max(max_num[i][j-1],max_num[i+(1<<(j-1))][j-1]);
            min_num[i][j] = min(min_num[i][j-1],min_num[i+(1<<(j-1))][j-1]);
        }
    }
    
    //然后开始查询
    int l,r,pos = 0;
    scanf("%d%d",&l,&r);
    //首先用pos进行移位,找到对应的区间长度(这里指的长度是比他小的两个区间的长度,这样比较才能让这个区间充分填充),而pos表示对应的二进制的长度
    while ((1<<(pos+1)) <= r-l+1) pos++;
    cout<<max(max_num[l][pos],max_num[r-(1<<pos)+1][pos])<<endl;
    cout<<min(min_num[l][pos],min_num[r-(1<<pos)+1][pos])<<endl;
    return 0;
}
//10 1 2 3 4 5 6 7 8 9 10
// 3 5

LCA问题

  • LCA可以通过dfs暴力搜

  • 可通过树链剖分(top数组来看是否在一条链上,不一条链上的话就让深度大(也就是h小的往上爬),直到最后他们在一条链上,然后深度小的就是最近公共祖先)

  • 用tarjan算法(离线)

  • 用ST算法解决(在线)
    思路:
    用dfs遍历一边,得到一个dfs序(dfs序的性质:(1)长度为2*n-1,必定每个节点进入dfs一次,出dfs一次;(2)每一个子树对应一个唯一的序列,如子树BEFK,对应dfs序列中的BEEFKKFB;(3)每一段dfs序描述一段在树上的运行路径;(4)所有叶子节点在dfs序中都只出现1次)
    在这里插入图片描述
    (上图的dfs序:ABEBFKFBACGCHCICA 长度为17,节点数为9)
    dfs序列在LCA上的应用:
    对于任意点对在树上的路径的描述,

  • 如果两个点都是叶子节点,则他们在dfs序中出现的次数都是一次,所以此时在他们dfs序中的区间中的深度最低的即为LCA。例如上面EK区间段EBFK,其中深度最低的是B,所以B即为EK的LCA,再例如EH区间短EBFKFBACGCH,其中深度最低的是A,所以A是LCA)

发布了95 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43345204/article/details/100989458