news 2026/5/20 1:39:38

[模板]st表 RMQ区间最值问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[模板]st表 RMQ区间最值问题

【模板】静态区间最值_牛客题霸_牛客网

st表基于倍增的思想实现

最大值最小值思路一样 这里以最大值讲解

一个序列的子区间的个数显然有n*n个 根据倍增思想 我们首先在这个规模为n*n的状态空间中选择一些2的整数次幂的位置作为代表值

设f[i][j]表示数列中子区间[i][i+2^j-1]中的最大值 也就是包括i本身 一段长度为2^j的区间最大值 递推边界显然是f[i][0]=a[i] 也就是[i,i]区间中的最大值是本身;

在递推的时候 我们把子区间成倍增长 有公式f[i][j]=max( f[i][j-1], f[i+(1<<(j-1))][j-1] ) 也就是把一个区间的最值 分为了两个区间的最值中更大的那个

代码实现

int a[N],fmaxn[N][20],fminn[N][20]; void st(){ for(int i=1;i<=n;i++)fmaxn[i][0]=a[i],fminn[i][0]=a[i]; int t=log(n)/log(2)+1; for(int j=1;j<t;j++){ for(int i=1;i<=n-(1<<j)+1;i++){ fmaxn[i][j]=max(fmaxn[i][j-1],fmaxn[i+(1<<(j-1))][j-1]); fminn[i][j]=min(fminn[i][j-1],fminn[i+(1<<(j-1))][j-1]); } } }

最值查询部分

查询区间[l,r]的最值的时候 我们先计算一个k满足2^k<=r-l+1<2^(k+1) 也就是2的k次幂小于区间长度下 然后比较以l开头的2^k个数的区间中的最大值 和 r结尾的2^k个数字的区间的最大值 因为求的是最值 所以这两个区间可以重叠 但是必须包含所有的元素

查询代码实现:

int query(int op,int l,int r){ int k=log(r-l+1)/log(2); if(op==1)return min(fminn[l][k],fminn[r-(1<<k)+1][k]); if(op==2)return max(fmaxn[l][k],fmaxn[r-(1<<k)+1][k]); }

该题完整代码实现:

#include <bits/stdc++.h> using namespace std; int n,q; const int N=5e5+5; int a[N],fmaxn[N][20],fminn[N][20]; void st(){ for(int i=1;i<=n;i++)fmaxn[i][0]=a[i],fminn[i][0]=a[i]; int t=log(n)/log(2)+1; for(int j=1;j<t;j++){ for(int i=1;i<=n-(1<<j)+1;i++){ fmaxn[i][j]=max(fmaxn[i][j-1],fmaxn[i+(1<<(j-1))][j-1]); fminn[i][j]=min(fminn[i][j-1],fminn[i+(1<<(j-1))][j-1]); } } } int query(int op,int l,int r){ int k=log(r-l+1)/log(2); if(op==1)return min(fminn[l][k],fminn[r-(1<<k)+1][k]); if(op==2)return max(fmaxn[l][k],fmaxn[r-(1<<k)+1][k]); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>q; for(int i=1;i<=n;i++)cin>>a[i]; st(); while(q--){ int op,l,r; cin>>op>>l>>r; cout<<query(op,l,r)<<'\n'; } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/17 4:08:34

16GB显存驱动210亿参数:GPT-OSS-20B引爆中小企业AI本地化革命

16GB显存驱动210亿参数&#xff1a;GPT-OSS-20B引爆中小企业AI本地化革命 【免费下载链接】gpt-oss-20b gpt-oss-20b —— 适用于低延迟和本地或特定用途的场景&#xff08;210 亿参数&#xff0c;其中 36 亿活跃参数&#xff09; 项目地址: https://ai.gitcode.com/hf_mirro…

作者头像 李华
网站建设 2026/5/15 19:44:00

嘿嘿,一个简单ElasticSearch小实现

一、启动 Elasticsearch 服务&#xff08;Docker 简单搞定&#xff09;这里用的是 Elasticsearch 8.xx&#xff0c;主要是考虑我们项目还在用 JDK 8。1. dockerdocker run \-d \--privilegedtrue \--name elasticsearch \-p 9200:9200 \-p 9300:9300 \-e "ES_JAVA_OPTS-Xm…

作者头像 李华
网站建设 2026/5/6 22:13:19

为什么需要专门的环境变量解决方案?

类型安全问题&#xff1a;环境变量没有类型检查&#xff0c;容易在运行时出错验证缺失&#xff1a;无法确保必需的环境变量都已正确配置客户端/服务端混淆&#xff1a;可能意外将敏感变量暴露到客户端团队协作困难&#xff1a;新成员不知道需要配置哪些环境变量T3 Env 正是为了…

作者头像 李华
网站建设 2026/5/6 21:42:09

Konva.js交互式Canvas开发:从零构建动态图形应用

Konva.js交互式Canvas开发&#xff1a;从零构建动态图形应用 【免费下载链接】konva Konva.js is an HTML5 Canvas JavaScript framework that extends the 2d context by enabling canvas interactivity for desktop and mobile applications. 项目地址: https://gitcode.co…

作者头像 李华
网站建设 2026/5/15 2:21:37

12、网络队列、流量整形与冗余性配置全解析

网络队列、流量整形与冗余性配置全解析 1. 基于类的小网络带宽分配(cbq) 在网络管理中,提升网络性能固然重要,但有时网络会有其他需求。例如,像电子邮件等关键服务需要始终保证一定的带宽,而像点对点文件共享这类服务则不应占用过多带宽。基于类的队列(cbq)规则能满足…

作者头像 李华
网站建设 2026/5/9 11:33:36

NextStep-1:连续令牌技术重构AI图像生成范式

NextStep-1&#xff1a;连续令牌技术重构AI图像生成范式 【免费下载链接】NextStep-1-Large 项目地址: https://ai.gitcode.com/StepFun/NextStep-1-Large 导语&#xff1a;140亿参数自回归模型改写图像生成规则 2025年8月&#xff0c;阶跃星辰&#xff08;StepFun&am…

作者头像 李华