当前位置: 首页 > 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.jsqmd.com/news/73252/

相关文章:

  • Jetson Secure Boot 完整实战指南:从 Fuse Key → Boot Chain → 验签代码路径的源码级解析
  • miniconda anaconda下载
  • 滑动窗口
  • 基于像素流的多游戏引擎实时云渲染系统设计与实现
  • 机械臂的舞蹈从数学开始——xArm6运动学拆解日记
  • 双向RRT算法求解路径规划问题
  • Fortran 的英文数字验证码识别系统设计与实现
  • 重塑Java工程效能:全流程智能开发平台实践解析
  • 鸿蒙 Flutter 安全组件开发:加密输入框与脱敏展示组件
  • 如何找書
  • 实现kvstore的持久化功能:全量持久化和增量持久化
  • 摄影师必备Lightroom修图软件最新版下载与安装指南
  • 如何把你的.git 分離出 OneDrive/iCloud
  • 面试必问:如何快速定位BUG?BUG定位技巧及N板斧!
  • TurboPFor整数压缩:突破性能极限的高速数据处理方案
  • Meta公开抄阿里Qwen作业,还闭源了...
  • 故障处理:Oracle ADG 主库想备库传输日志的归档路径禁用的报错
  • 如何啓動一個本地服務
  • unity运行后笔记本风扇声音太大的解决办法
  • 5种必知的前端数据加密防护技术:从React安全到浏览器原生方案
  • ROS2节点和话题
  • Wan2.2-T2V-A14B如何生成带有烟花绽放效果的节日庆典视频?
  • 5分钟快速上手MONAI 2D扩散模型:医学图像生成的终极指南
  • 2025最新广州瑜伽教练培训TOP5评测!专业瑜伽馆+资深导师团队,铸就专业瑜伽人才摇篮 - 全局中转站
  • US$475 One Year Update Service for XTOOL X100 MAX
  • 【LeetCode30_滑动窗口 + 哈希表】:三招搞定“串联所有单词的子串”
  • try_files $uri $uri/ /officalWebAdmin/index.html; 这个配置具体是什么含义呢
  • Restormer 去雨(Deraining)任务代码运行全流程
  • 机器学习基础(线性,逻辑回归)
  • 程序员转行到大模型开发领域,以下是几个推荐的方向、推荐原因以