【ST表】【模板】ST表

Definition

     ST表是一种用于处理静态RMQ问题(无修改区间最值问题)的最快数据结构,书写方便使用简单效率便捷。其中其预处理复杂度为O(nlogn),查询复杂度为O(1)。总时间复杂度为O(nlogn)。常数远小于树状数组、线段树等毒瘤数据结构。

     事实上,ST表不能叫做ST。因为T本身就代表table= =

     ST表在预处理时采用倍增以及DP思想,即设f[i][j]为i向右2j-1个坐标的最大值。在DP时以j为阶段进行转移。

     在查询时,由于2的(被查询区间长度的对数的两倍)个单位(即22*log(len))一定大于区间长度,所以可以查询左右端点向中间2log(len)-1个单位的最大值,取max即为答案。

     由于ST表极为简单,在这里直接给出代码。

Code

#include<cmath>
#include<cstdio>
#define maxn 100010

inline void qr(int &x) {
    char ch=getchar();int f=1;
    while(ch>'9'||ch<'0')    {
        if(ch=='-')    f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')    x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x*=f;
    return;
}

inline int max(const int &a,const int &b) {if(a>b) return a;else return b;}
inline int min(const int &a,const int &b) {if(a<b) return a;else return b;}
inline int abs(const int &x) {if(x>0) return x;else return -x;}

inline void swap(int &a,int &b) {
    int c=a;a=b;b=c;return;
}

int n,m,frog[maxn][20],LOG[maxn],a,b;

int main() {
    qr(n);qr(m);
    for(int i=1;i<=n;++i) {qr(frog[i][0]);LOG[i]=log2(i);}
    for(int j=1;j<=21;++j) {
        for(int i=1;i<=n;++i) {
            if(i+(1<<j)-1>n)    break;
            frog[i][j]=max(frog[i][j-1],frog[i+(1<<(j-1))][j-1]);
        }
    }
    while(m--) {
        a=b=0;qr(a);qr(b);int &t=LOG[b-a+1];
        printf("%d\n",max(frog[a][t],frog[b-(1<<t)+1][t]));
    }
    return 0;
}
posted @ 2018-07-08 20:57  一扶苏一  阅读(1371)  评论(0编辑  收藏  举报