ST表 洛谷 P3865 ST表模板题

ST表 洛谷 P3865 ST表模板题

首先,来说说为什么学ST表哈。

ST表类似于树状数组和线段树这两种数据结构

在解决RMQ问题时,ST表和线段树的预处理时间复杂度都是O(nlogn),两者的不同在于,在查询RMQ答案时,ST表的时间复杂度为O(1),而线段树却有 O (logn),这是ST表的优势就完全体现出来了。

ST表实际上是一个二维数组 ST[i] [j],含义是:从下标i 到下标 i+2^j-1 的最值

因为是可以直接套用的模板,所以就直接上代码了:

//ST表模板题
#include 
using namespace std;
const int maxn=1e5+7;
int n,m,l,r;
int a[maxn];
int ST[maxn][20];
void pre(){
    for(int i=1;i<=n;i++)
        ST[i][0]=a[i];//先将起点赋值
    for(int i=1;(1<<i)<=n;i++)
        for(int j=1;j+(1<<i)-1<=n;j++)//此处j代表起点,i代表到达的2^i-1的长度
            ST[j][i]=max(ST[j][i-1],ST[j+(1<<(i-1))][i-1]);
}
int getans(int l,int r){
    int k=(int)(log((double)(r-l+1))/log(2.0));//获取你需要跨越的长度2^k-1
    return max(ST[l][k],ST[r-(1<<k)+1][k]);
}
int main(){
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    pre();
    while(m--){
        scanf("%d %d",&l,&r);
        printf("%d\n",getans(l,r));
    }
return 0;
}

你可能感兴趣的:(C++,数据结构,洛谷)