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

再谈ST表

再谈 ST 表

思想:倍增。

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

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

下文以最大值为例。

预处理

状态:设f i , j f_{i,j}fi,j表示区间[ i , i + 2 j − 1 ] [i,i+2^j-1][i,i+2j1]的最大值。

那么递推式就有:
f i , j = max ⁡ { f i , j − 1 , f i + 2 j − 1 , j − 1 } f_{i,j}=\max\left\{f_{i,j-1},f_{i+2^{j-1},j-1}\right\}fi,j=max{fi,j1,fi+2j1,j1}
显然边界是f i , 0 = a i f_{i,0}=a_ifi,0=ai。其中a i a_iai是原序列。

图解:

其中第二个,区间右边界是i + 2 j − 1 + 2 j − 1 − 1 = i + 2 j − 1 i+2^{j-1}+2^{j-1}-1=i+2^j-1i+2j1+2j11=i+2j1

查询

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

找到max ⁡ { k ∣ 2 k < r − l + 1 ≤ 2 k + 1 } \max\left\{k\mid 2^k<r-l+1\le 2^{k+1}\right\}max{k2k<rl+12k+1}

[ l , r ] [l,r][l,r]分解为[ l , l + 2 k − 1 ] ∪ [ r − 2 k + 1 , r ] [l,l+2^k-1]\cup [r-2^k+1,r][l,l+2k1][r2k+1,r]

即从l ll开始的2 k 2^k2k个元素与r rr结尾的2 k 2^k2k个元素。

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

对于r − 2 k + 1 r-2^k+1r2k+1的解释:
r − 2 k + 1 + 2 k − 1 = r r-2^k+1+2^k-1=rr2k+1+2k1=r
所以式子就是:
max ⁡ { f l , k , f r − 2 k + 1 , k } \max\left\{f_{l,k},f_{r-2^k+1,k}\right\}max{fl,k,fr2k+1,k}
注意:ST 表是预处理完查询,所以不支持修改。

示例代码

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

#include<bits/stdc++.h>usingnamespacestd;typedeflonglongljl;#defineFUP(i,x,y)for(autoi=(x);i<=(y);++i)#defineFDW(i,x,y)for(autoi=(x);i>=(y);--i)inlinevoidRd(auto&num);constintN=1e5+5,L=25;intn,m,a[N];namespaceST{intf[N][L],Lg2[N];voidBuild(){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;}intquery(intl,intr){intlens=r-l+1;intk=Lg2[lens];returnmax(f[l][k],f[r-(1<<k)+1][k]);}}intmain(){Rd(n);Rd(m);FUP(i,1,n)Rd(a[i]);ST::Build();intl,r;while(m--){Rd(l);Rd(r);printf("%d\n",ST::query(l,r));}return0;}inlinevoidRd(auto&num){num=0;charch=getchar();boolf=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.cnnetsun.cn/news/10868.html

相关文章:

  • 2026年机器人感知与智能控制国际学术会议(RPIC 2026)
  • Wan2.2-T2V-A14B生成视频可用于YouTube盈利吗?合规性解读
  • 【Docker Scout AI漏洞扫描揭秘】:如何利用人工智能精准发现容器安全盲点
  • Spring Kafka 动态消费实现案例
  • Wan2.2-T2V-A14B模型推理性能调优实战技巧分享
  • GraniStudio零代码平台调试算子方式有多少种?分别都是如何调试?
  • 小米14C刷国际版步骤
  • 智谱开源天团登陆 AtomGit,4 大模型覆盖多模态全场景!
  • 开源视频生成技术再突破:Wan2.1-FLF2V-14B模型实现720P高清流畅过渡
  • 教学辅助微信小程序设计毕业设计(源码+lw+部署文档+讲解等)
  • 【AUTOSAR AP Core】AUTOSAR AP核心:Executor角色揭秘
  • Chrony时间同步服务:从底层原理到技术演进的全景解析
  • 线性回归与KNN算法的核心原理及实践应用
  • Windows右键菜单革命:从混乱到高效的终极解决方案
  • 入门友好的低代码平台推荐,其中一款完全免费又能私有化部署
  • 基于VUE的小剧场票务系统[VUE]-计算机毕业设计源码+LW文档
  • AI不再“失忆“!揭秘让大模型记住一切的神奇技术,代码详解+实战教程,小白也能变大神!
  • Wan2.2-T2V-A14B模型API接口设计与调用示例详解
  • 如何快速实现Unity游戏翻译:XUnity.AutoTranslator终极指南
  • 阿里Qwen3双模型震撼开源:嵌入式与重排序技术革新RAG应用生态
  • HNU分布式数据库华为云数据库TaurusDB实践
  • 阿里Qwen3-Next模型震撼登场:800亿参数“轻装上阵“,香港企业AI应用成本大降90%
  • 备考华为HCIE的秘诀!轻松拿下顶级认证
  • 协同过滤扶贫助农系统系统
  • 现代 AI 代理设计:17 种架构的系统化实战合集
  • B站视频下载利器DownKyi:专业用户的终极操作指南
  • XUnity.AutoTranslator游戏翻译工具:新手完整使用指南
  • Wan2.2-T2V-A14B生成角色动作自然流畅的关键机制分析
  • 【2025最新】小白如何自学网络安全,零基础入门到精通,看这一篇就够了!
  • 终极指南:如何用Universal x86 Tuning Utility释放Intel CPU电压调节潜力