st表

st表

1.理解

st表是用来解决区间RMQ问题,简而言之就是求区间最值问题。

1.d数组表示的含义是什么呢?d[i] [j]表示的是区间[i,i+j^2-1]区间的最大值

2.那如何求的一个区间的最大值呢,利用的是dp思想,比如[5,10]这段区间的最大值,他就会求r-l+1最接近的二次幂。这段区间长度是6,所以与他最接近的因该是4,那这段区间的最值[5,8]和[7,10].这是咋求出来的呢?就是利用最大的二次幂,5的区间长度往后延长4个,10的区间长度往前减少四个,无论如何两个区间都会有交集,而且保了只求[5,10]这个区间。

3.最后总结就是求[l,r]区间最值的公式就是

k=log(rl+1)//

然后左右端点分别往中间走2^k个距离。

max(d[l][k],d[r(1<<k)+1][k])

2.模板

#include<bits/stdc++.h>
using namespace std;
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define pb push_back
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define inf 0x3fffffff
#define endl "\n"
typedef pair<int,int> PII;
#define ll long long
//st表模板
const int N=1e5+10;
int n,m;
int a[N];
int d[N][25];//记录的是区间[i,i+j^2-1]的最大值d[5][3]记录[5,5+2^3-1]区间最大值
//O(nlong)的初始化 O(1)的查询 空间也是O(nlogn);
void init(){
for(int i=1;i<=n;i++){
d[i][0]=a[i];
}
for(int j=1;(1<<j)<=n;j++){//控制查询长度最大为n
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=log2(r-l+1);//log函数就是数学意义中的log函数,只是向下取整
return max(d[l][k],d[r-(1<<k)+1][k]);
}
int main(){
IOS
cin>>n>>m;
fel(i,1,n) cin>>a[i];
init();
fel(i,1,m){
int l,r;
cin>>l>>r;
cout<<rmq(l,r)<<endl;
}
return 0;
}
 
posted @   silky__player  阅读(311)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示