当前位置: 首页 > news >正文

再谈ST表

再谈 ST 表

思想:倍增。

适用范围:对于一个不可修改的序列维护区间最大/最小值询问。

时间:\(O(n\log n)\) 预处理,\(O(1)\) 查询。

下文以最大值为例。

预处理

状态:设 \(f_{i,j}\) 表示区间 \([i,i+2^j-1]\) 的最大值。

那么递推式就有:

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

显然边界是 \(f_{i,0}=a_i\)。其中 \(a_i\) 是原序列。

图解:

其中第二个,区间右边界是 \(i+2^{j-1}+2^{j-1}-1=i+2^j-1\)

查询

假设查询区间为 \([l,r]\)

找到 \(\max\left\{k\mid 2^k<r-l+1\le 2^{k+1}\right\}\)

\([l,r]\) 分解为 \([l,l+2^k-1]\cup [r-2^k+1,r]\)

即从 \(l\) 开始的 \(2^k\) 个元素与 \(r\) 结尾的 \(2^k\) 个元素。

因为 \(2^k<r-l+1\le 2^{k+1}\),所以这俩区间一定可以覆盖整个查询区间。

对于 \(r-2^k+1\) 的解释:

\[r-2^k+1+2^k-1=r \]

所以式子就是:

\[\max\left\{f_{l,k},f_{r-2^k+1,k}\right\} \]

注意:ST 表是预处理完查询,所以不支持修改。

示例代码

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

#include<bits/stdc++.h>
using namespace std;
typedef long long ljl;
#define FUP(i,x,y) for(auto i=(x);i<=(y);++i)
#define FDW(i,x,y) for(auto i=(x);i>=(y);--i)
inline void Rd(auto &num);
const int N=1e5+5,L=25;
int n,m,a[N];
namespace ST{int f[N][L],Lg2[N];void Build(){Lg2[1]=0;FUP(i,2,n)Lg2[i]=Lg2[i/2]+1;FUP(i,1,n)f[i][0]=a[i];FUP(j,1,20){FUP(i,1,n){if(i+(1<<(j-1))>n)break;f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);}}return;}int query(int l,int r){int lens=r-l+1;int k=Lg2[lens];return max(f[l][k],f[r-(1<<k)+1][k]);}
}
int main(){Rd(n);Rd(m);FUP(i,1,n)Rd(a[i]);ST::Build();int l,r;while(m--){Rd(l);Rd(r);printf("%d\n",ST::query(l,r));}return 0;
}
inline void Rd(auto &num)
{num=0;char ch=getchar();bool f=0;while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}while(ch>='0'&&ch<='9'){num=(num<<1)+(num<<3)+(ch-'0');ch=getchar();}if(f)num=-num;return;
}
http://www.rkmt.cn/news/83762.html

相关文章:

  • 基于像素流的多游戏引擎实时云渲染系统设计与实现
  • 重塑Java工程效能:全流程智能开发平台实践解析
  • 实现kvstore的持久化功能:全量持久化和增量持久化
  • 摄影师必备Lightroom修图软件最新版下载与安装指南
  • unity运行后笔记本风扇声音太大的解决办法
  • 故障处理:Oracle ADG 主库想备库传输日志的归档路径禁用的报错
  • 5种必知的前端数据加密防护技术:从React安全到浏览器原生方案
  • Windows11安装docker
  • Cameralink采集软件-Espeedgrab软件应用【2.存储图片和视频】
  • AcWing 846:树的重心 ← 类似“东方博宜OJ 2190:树的重心”代码
  • 容器化部署在软件许可优化中的应用:跨部门资源共享实践
  • 2025年可观测平台选型指南:头部厂商综合测评与推荐
  • docker启动mysql及部分命令回顾
  • Teams Agent开发避坑指南,90%新手都会忽略的3大陷阱
  • 直播带货APP开发的核心流程:推流端、观看端与运营端后台搭建指南
  • 用循环神经网络生成0^n 1^n形式的简单序列
  • AcWing 846:树的重心 ← 链式前向星 or 邻接表
  • 251211
  • Python自然语言处理的未来:技术栈与开发范式
  • 观察者模式
  • 2025年东莞优质的铝门窗批发选哪家,安全门窗/铝门窗/慕莎尼奥门窗/窗纱一体铝门窗/门窗/铝门窗品牌选哪家 - 品牌推荐师
  • 2025.12.11总结
  • 124_尚硅谷_闭包的基本介绍
  • One Year XTOOL D9S Update Service: Keep Diagnostics Up-to-Date for EU US Vehicles
  • 2025年数控车床品牌新格局,机械手集成能力排行揭晓,动力刀塔数控车/牙科配件数控车床/新能源数控车床/军工配件数控机床数控车床设计怎么选择 - 品牌推荐师
  • 如何确定arm固件的加载地址
  • 2025年国内靠谱的门窗源头厂家推荐,全屋门窗/环保门窗/复古门窗/极简门窗/欧式门窗/智能门窗/门窗直销厂家找哪家 - 品牌推荐师
  • 基于协同过滤推荐算法的求职招聘推荐系统u1ydn3f4(程序、源码、数据库、调试部署优秀的方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
  • 12.11笔记
  • 中国人工智能学会推荐国际学术会议和国际/国内期刊目录