ST表

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;

const int MAXN=1e6;

inline int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

int Max[MAXN][21];

int Query(int l,int r)
{
    int k=log2(r-l+1);
    return max(Max[l][k],Max[r-(1<<k)+1][k]);
}

int main()
{

    int N=read(),M=read();

    for(int i=1;i<=N;i++)
    Max[i][0]=read();

    for(int i=1;i<=21;i++)
        for(int j=1;j+(1<<i)-1<=N;j++)//(1<<i) j加2的i次方 
            Max[j][i]=max(Max[j][i-1],Max[j+(1<<(i-1))][i-1]);
            
        for(int i=1;i<=M;i++)
        {
            int l=read(),r=read();
            
            printf("%d\n",Query(l,r));
                
        }

    return 0;
    
}

 这个题总感觉和Dp有辣么一点相似,首先Max[i][j]表示的是从i这个点到2的j次方这个点的这一段区间的最大值(或最小值),是不是有点Dp的感觉,对于静态查询的ST表,主要思路是把每个区间的最大或最小值提前预处理,在需要查询的时候,在相应区间内通过比较各个小区间的值来求出最终的答案。和二分的思想差不多,将大区间分为多个小区间,最终来更新答案。

//该题解代码 来源于洛古题解

posted @ 2020-07-05 15:41  头顶凉风  阅读(93)  评论(0编辑  收藏  举报