码迷,mamicode.com
首页 > 其他好文 > 详细

【ST表】【模板】ST表

时间:2018-07-08 22:06:12      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:直接   ++   预处理   左右   char   through   ini   st表   max   

Definition

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

     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;
}

【ST表】【模板】ST表

标签:直接   ++   预处理   左右   char   through   ini   st表   max   

原文地址:https://www.cnblogs.com/yifusuyi/p/9281250.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!