求区间最值(ST表算法)

ST表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为O(nlongn),查询为O(1)。适用于不更新信息且查询很多的问题。

例题:P3865 【模板】ST表(该题卡常,要用快读)
代码注释已讲解部分注意点

#include
#include
#define MAXPOW 20//最大数据量n是2的MAXPOW次方
#define MAXN 100005
using namespace std;

int pow_my[MAXPOW+1];
int log_my[MAXN];
int st[MAXPOW][MAXN],a[MAXN];
int n,m,l,r,len;

int main()
{
    scanf("%d%d",&n,&m);
    log_my[0]=-1;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }

    //st_solve
    pow_my[0]=1;
    for(int i=1;i<=MAXPOW;i++){
        pow_my[i]=pow_my[i-1]*2;
    }

    log_my[0]=-1;
    for(int i=1;i<=n;i++){
        log_my[i]=log_my[i/2]+1;
    }

    for(int j=1;j<=n;j++)st[0][j]=a[j];
    
    for(int i=1;i<=log_my[n];i++){
        for(int j=1;j<=n;j++){
            if(j+pow_my[i]-1<=n){
                //求区间最大值
                st[i][j]=max(st[i-1][j],st[i-1][j+pow_my[i-1]]);
            }
        }
    }

    //打印区间[l,r]的最大值
    for(int i=1;i<=m;i++){
        scanf("%d%d",&l,&r);
        len=log_my[r-l+1];
        printf("%d\n",max(st[len][l],st[len][r-pow_my[len]+1]));
    }

    return 0;
}

你可能感兴趣的:(算法)