ST 表

ST 表

ST 表,主要思想是空间换时间,用于解决可重复贡献问题和 RMQ 问题。

可重复贡献问题

指某个运算 op,有 x op x = x 。例如 max(x,x)=x  min(x,x)=x  gcd(x,x)=x

RMQ 问题

指在区间内的最大/最小值查询。

ST 表

ST 表基于倍增的思想,做到 O(nlogn) 的预处理时间,O(1) 的查询时间。副作用是不支持修改操作。

而 ST 表的实现类似于 dp,设 fi,j 表示区间 [i,i+2j1] 的最大值。

而显然 fi,0=ai​。

为什么是 i+2j1 而不是 i+2j 呢?

因为很巧,如果 j=0,则 20=1,得再减个一。

那么第二维的意思也就是在倍增的时候,调了 2j1 步。

那么状态转移方程:

fi,j=max(fi,j1,fi+2j1,j1)

可以基于下面这张图(神图)来理解。

对于每个询问 [l,r],可以分成两部分,分别是 [l,l+2s1],[r2s+1,r]

s=log2rl+1

模板代码

例题:P3865 【模板】ST 表 && RMQ 问题

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,logn=21;
int n,m,f[N][logn],Log[N],x,y,s;
inline void init()
{
Log[1]=0;
Log[2]=1;
for(int i=3;i<N;i++)
Log[i]=Log[i/2]+1;
for(int j=1;j<=logn;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]);
return;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&f[i][0]);
init();
while(m--)
{
scanf("%d%d",&x,&y);
s=Log[y-x+1];
printf("%d\n",max(f[x][s],f[y-(1<<s)+1][s]));
}
return 0;
}
posted @   Atserckcn  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示