ST表(Sparse Table,稀疏表)

ST表(Sparse Table,稀疏表)

主要用来解决 RMQ,可重复贡献问题 问题,相比于线段树,ST表能够做到在 \(O(n\log n)\) 的时间内预处理,以 \(O(1)\) 的速度查询

基于倍增算法,预处理每个区间,这里以维护区间最大值为例


原理是利用倍增法递推,用两个等长的小区间拼凑大区间

记 $f_{i,j} $ 为以 \(a_i\) 为左端点,区间长度为 \(2^j\) 的区间中的最大值,那么满足递推式

\[f_{i,j}=max(f_{i,j-1},f_{i+2^{j-1},j-1}) \]

for (int i=1;i<=n;i++) f[i][0]=a[i];
for (int j=1;j<=maxlg;j++)//maxlg表示不大于n的最大2次幂的指数
for (int i=1;i+(1<<j)-1<=n;i++)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);

\(f_{i,j}\) 中第二维 \(j\) 的大小通过 \(\log_2n\) 计算,可以增加记忆数组 \(lg_{i}\) ,用来存储区间长度(速度可能比 log() 快?)

lg[1]=0;
for (int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;//递推计算不大于i的最大2次幂的指数

查询时,从 \([l,r]\) 两端出发,分别延伸出 \(lg_{r-l+1}\) 的区间长度,可以证明,这两段一定能覆盖完整个区间

左区间为 \([l,l+2^{lg_{r-l+1}}]\) ,右区间为 \([r-2^{lg_{r-l+1}}+1,r]\)

\(k=lg_{r-l+1}\):

\[ans=max(f_{l,k},f_{r-2^k+1,k}) \]

cin>>l>>r;
int k=lg[r-l+1];
cout<<max(f[l][k],f[r-(1<<k)+1][k]);//位运算加速

以洛谷P2880为例

// Problem: P2880 [USACO07JAN] Balanced Lineup G
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2880
// Memory Limit: 512 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
#define cintie ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define Trd int T;cin>>T;while (T--)solve();
#define LLinf 9e18;
#define Iinf 2e9
#define LL long long
#define Lc p<<1
#define Rc p<<1|1
#define lc(x) tr[x].ch[0]
#define rc(x) tr[x].ch[1]
using namespace std;
int n,q;
int lg[180010];
int f[180010][18];
int p[180010][18];
int main()
{
cin>>n>>q;
for (int i=1;i<=n;i++){
cin>>f[i][0];
p[i][0]=f[i][0];
}
for (int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
for (int j=1;j<=lg[n];j++){
for (int i=1;i+(1<<j)-1<=n;i++){
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
p[i][j]=min(p[i][j-1],p[i+(1<<(j-1))][j-1]);
}
}
while (q--){
int a,b;
cin>>a>>b;
int k=lg[b-a+1];
cout<<max(f[a][k],f[b-(1<<k)+1][k])-min(p[a][k],p[b-(1<<k)+1][k])<<endl;
}
return 0;
}
posted @   才瓯  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示