ST表
定义:
1.ST表是一种数据结构,用来解决区间内的一些问题(比如可以求区间最小值、区间最大值),ST表采
用的倍增的思想,我们在使用ST表的时候,可以做到o(nlogn)的时间建表,做到用o(1)的时间去查询.
RMQ问题:
RMQ问题主要用ST表和树状图来解决.
优点:ST表运行效率高.树状图支持求改操作.
缺点:ST表无法进行修改.树状图运行效率低.
说道ST表,就不得不提到:
位运算:
& , | , ^ , ~ , << , >>
这里不多解释详情请看《深入浅出》P276.
例题:
【模板】ST 表
题目背景
这是一道 ST 表经典题——静态区间最大值
请注意最大数据时限只有 0.8s,数据强度不低,请务必保证你的每次查询复杂度为 $O(1)$。若使用更高时间复杂度算法不保证能通过。**
如果您认为您的代码时间复杂度正确但是 TLE,可以尝试使用快速读入:
cpp
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
函数返回值为读入的第一个整数。
快速读入作用仅为加快读入,并非强制使用。**
题目描述
给定一个长度为 $N$ 的数列,和 $ M $ 次询问,求出每一次询问的区间内数字的最大值。
输入格式
第一行包含两个整数 $N,M$,分别表示数列的长度和询问的个数。
第二行包含 $N$ 个整数(记为 $a_i$),依次表示数列的第 $i$ 项。
接下来 $M$ 行,每行包含两个整数 $l_i,r_i$,表示查询的区间为 $[l_i,r_i]$。
输出格式
输出包含 $M$ 行,每行一个整数,依次表示每一次询问的结果。
样例 #1
样例输入 #1
8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8
代码:
#include<bits/stdc++.h> using namespace std; int n,m,l,r,k,a[100001],f[100001][30],L[100001]; int read(){ int num=0,w=1; char bb=getchar(); while(bb<'0'||bb>'9'){ if(bb=='-') w=-1; bb=getchar(); } while(bb>='0'&&bb<='9') { num=(num<<1)+(num<<3)+bb-'0'; bb=getchar(); } return num*w; } void st(){ L[0]=-1; for(int i=1;i<=n;i++) L[i]=L[i>>1]+1; for(int i=1;i<=n;i++) f[i][0]=a[i]; for(int j=1;j<=L[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]); return; } int main(){ n=read(),m=read(); for(int i=1;i<=n;i++) a[i]=read(); st(); while(m--){ l=read(),r=read(); k=L[r-l+1]; printf("%d\n",max(f[l][k],f[r-(1<<k)+1][k])); } return 0; }
ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表 ST表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现