ST表

Posted lovedsr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ST表相关的知识,希望对你有一定的参考价值。

luogu3865

这就是倍增的思想、、

不支持更改,建表是nlogn

然后查询两个部分重叠比较,O(1)

#include<cstdio>
#include<cmath>
int n,m;
int a[100103],st[101000][32];

void read(int &n){
    int f=1;n=0;char s=getchar();
    while(9<s||s<0){if(s==-)f=-1;s=getchar();}
    while(0<=s&&s<=9){n=n*10+s-0;s=getchar();}
    n*=f;
}

int max(int x,int y){
    return x>y?x:y;
}

void rmq_st(){
    for(int i = 1;i <= n;++ i)
         st[i][0]=a[i];//初始化,它本身的前缀
     for(int j=1;(1<<j)<=n;++j){//这个是2^j 
         for(int i=1;i+(1<<j)-1<=n;++i){//1~n
             st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]); 
        }
     }
}

int sum(int l, int r){
    int k=(log2(r-l+1));//求log 
    return max(st[l][k],st[r-(1<<k)+1][k]);//区间最大值在
    //他右边或者左边,2^k是恰好小鱼他们之间距离的长度
    //所以最大值一定包含里面,重合部分不受影响,又不是求sum 
}      

int main()
{
    read(n);read(m);
    for(int i = 1;i <= n;++ i){
        read(a[i]);//用a数组建一个st表
    }
    rmq_st();
    int l_, r_; 
    while(m--){
        read(l_);read(r_);
        printf("%d\n",sum(l_,r_));
    }
    return 0;
}

 

以上是关于ST表的主要内容,如果未能解决你的问题,请参考以下文章

将数据从底部工作表对话框片段传递到片段

LCA 算法ST表

模板st表

RMQ ST表

算法详解——st表

从底部工作表对话框片段中获取价值