给定一个长度为 NN 的数列,和 MM 次询问,求出每一次询问的区间内数字的最大值。

线段树可以做到O(logN)查询,但这远远不够。

所以附上ST算法的模板:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+3;
int n,m,a[maxn],d[maxn][23];
void ST_init()
{
    for(int i=1;i<=n;i++)d[i][0]=a[i];
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
        d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
}
int RMQ(int l,int r)
{
    int k=0;
    while((1<<(k+1))<r-l+1)k++;
    return max(d[l][k],d[r-(1<<k)+1][k]);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    ST_init();int l,r;
    while(m--)
    {
        scanf("%d%d",&l,&r);
        printf("%d\n",RMQ(l,r));
    }
    return 0;
}

 

posted on 2018-11-05 07:58  RodimusPrime  阅读(150)  评论(0)    收藏  举报