news 2026/7/7 2:32:10

再谈ST表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
再谈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;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 23:06:31

微软Phi-4-mini-flash-reasoning震撼开源:边缘AI推理效率实现10倍飞跃

在人工智能模型日益追求参数规模与计算性能的当下&#xff0c;微软于近日宣布开源Phi-4-mini-flash-reasoning模型&#xff0c;为边缘计算场景带来突破性进展。该模型凭借创新的SambaY架构设计&#xff0c;在保持轻量化特性的同时&#xff0c;将推理效率提升10倍&#xff0c;首…

作者头像 李华
网站建设 2026/7/7 17:08:09

Wan2.2-T2V-A14B在核磁共振成像原理科普中的微观世界构建

Wan2.2-T2V-A14B在核磁共振成像原理科普中的微观世界构建 在医学影像技术的课堂上&#xff0c;教师常常面临一个棘手问题&#xff1a;如何向学生解释那些看不见、摸不着的物理过程&#xff1f;比如核磁共振成像&#xff08;MRI&#xff09;中&#xff0c;氢原子核在强磁场中的行…

作者头像 李华
网站建设 2026/7/7 11:52:28

如何微调Wan2.2-T2V-A14B适配垂直领域?医疗动画案例演示

如何微调Wan2.2-T2V-A14B适配垂直领域&#xff1f;医疗动画案例演示 在医学教育和患者沟通中&#xff0c;一段清晰的动画往往胜过千言万语。但传统医疗动画制作依赖专业团队建模、渲染&#xff0c;周期动辄数周&#xff0c;成本高昂。如今&#xff0c;随着文本到视频&#xff0…

作者头像 李华
网站建设 2026/7/7 4:51:46

Qt Creator

一、QT简介1、Qt是一个1991年由Qt Company开发的 跨平台 C 图形用户界面应用程序开发框架。​ 框架&#xff1a;一堆能够实现特殊功能的类和函数。2、它既可以开发GUI程序&#xff0c;也可用于开发非GUI程序&#xff0c;比如控制台工具和服务器。GUI&#xff08;Graphica…

作者头像 李华
网站建设 2026/7/7 4:56:50

编程竞赛学习社区推荐:洛谷Codeforces群如何拓展思维边界?

编程竞赛学习社区推荐&#xff1a;洛谷Codeforces群如何拓展思维边界&#xff1f;核心要点竞赛思维能力的培养并非依赖天赋&#xff0c;而是通过“基础巩固—专项训练—实战模拟—赛后复盘—持续续航”五个阶段的系统性刻意练习来实现。积极参与洛谷、Codeforces群等学习社区的…

作者头像 李华
网站建设 2026/7/7 18:38:33

仿生记忆技术突破:字节跳动AHN-GDN模型实现百万字文本处理效率跃升

在人工智能领域&#xff0c;长文本处理一直是制约AI向深度认知发展的关键瓶颈。字节跳动Seed团队最新研发的人工海马体网络&#xff08;AHN&#xff09;技术&#xff0c;通过精妙模拟人脑记忆存储与提取机制&#xff0c;在处理12.8万字超长文本时实现计算量降低40.5%、内存占用…

作者头像 李华