ST表 洛谷 P3865 ST表模板题

20 篇文章 0 订阅
15 篇文章 0 订阅

ST表 洛谷 P3865 ST表模板题

首先,来说说为什么学ST表哈。

ST表类似于树状数组和线段树这两种数据结构

在解决RMQ问题时,ST表和线段树的预处理时间复杂度都是O(nlogn),两者的不同在于,在查询RMQ答案时,ST表的时间复杂度为O(1),而线段树却有 O (logn),这是ST表的优势就完全体现出来了。

ST表实际上是一个二维数组 ST[i] [j],含义是:从下标i 到下标 i+2^j-1 的最值

因为是可以直接套用的模板,所以就直接上代码了:

//ST表模板题
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
int n,m,l,r;
int a[maxn];
int ST[maxn][20];
void pre(){
    for(int i=1;i<=n;i++)
        ST[i][0]=a[i];//先将起点赋值
    for(int i=1;(1<<i)<=n;i++)
        for(int j=1;j+(1<<i)-1<=n;j++)//此处j代表起点,i代表到达的2^i-1的长度
            ST[j][i]=max(ST[j][i-1],ST[j+(1<<(i-1))][i-1]);
}
int getans(int l,int r){
    int k=(int)(log((double)(r-l+1))/log(2.0));//获取你需要跨越的长度2^k-1
    return max(ST[l][k],ST[r-(1<<k)+1][k]);
}
int main(){
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    pre();
    while(m--){
        scanf("%d %d",&l,&r);
        printf("%d\n",getans(l,r));
    }
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值