【C++】ST表求RMQ问题--代码+分析

洛谷 P3865 【模板】ST 表 & RMQ 问题

题目描述

给定一个长度为 N 的数列,和 M 次询问,求出每一次询问的区间内数字的最大值。

输入格式

第一行包含两个整数 N,M,分别表示数列的长度和询问的个数。

第二行包含 N 个整数(记为 ai​),依次表示数列的第 i 项。

接下来 M 行,每行包含两个整数 li​,ri​,表示查询的区间为 li​,ri​

输出格式

输出包含 M 行,每行一个整数,依次表示每一次询问的结果。

输入输出样例

输入 #1

cpp 复制代码
8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8

输出 #1

cpp 复制代码
9
9
7
7
9
8
7
9

做法&代码

定义 fij : 从 i 开始,2^j 步内,区间最大值 。

AC记录1AC记录2。这里展示两种代码,仅细节差别。日后会详解 ST表。

解释在注释里。

简洁版

此代码于另一段的区别:直接调用 <cmath> 库中的 log 函数。

cpp 复制代码
#include<iostream>
#include<cmath>
using namespace std;

int n,m,f[100010][20];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>f[i][0];
	
	int lg=log2(n);//log 
	for(int j=1;j<=lg;j++) {
		for(int i=1;i<=n-(1<<j)+1;i++)
			f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
	}//预处理 
	
	for(int i=1;i<=m;i++) {
		int x,y,l;
		cin>>x>>y;
		l==log2(y-x+1);
		cout<<max(f[x][l],f[y-(1<<l)+1][l])<<'\n';//查询 
	}
	return 0;
}//ST elseif123 on 2026/2/5

推荐版

自己手写 log,并把功能封装到函数。

cpp 复制代码
#include<iostream>
using namespace std;
const int N=1e5+7;

int n,m;
int f[N][20],lg[N];

void init() {//预处理 
	for(int j=1;(1<<j)<=n;j++)
		for(int i=1;i+(1<<j)/*相当于 2^j*/-1<=n;i++)
			f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
	
	lg[1]=0;
	for(int i=2;i<=n;i++)
		lg[i]=lg[i/2]+1;
}

int query(int l,int r) {//查询 
	int k=lg[r-l+1];
	return max(f[l][k],f[r-(1<<k)+1][k]);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>f[i][0];
	init();
	
	for(int i=0;i<m;i++) {
		int x,y;
		cin>>x>>y;
		cout<<query(x,y)<<'\n';
	}
	return 0;
}
相关推荐
高洁0116 小时前
工信部教考中心证书-人工智能系列本系列
人工智能·python·深度学习·算法
10岁的博客16 小时前
【C++题解】最多共线点问题:小飞拿蛋糕游戏的最优策略
c++
陈王卜16 小时前
Reduce 算子优化笔记
算法
wabs66616 小时前
关于图论【最短路径之Bellman_ford 算法(判断负权回路)|卡码网95.城市间货物运输II的思考】
数据结构·算法·图论·bellman_ford算法·卡码网·判断负权回路
東隅已逝,桑榆非晚16 小时前
类和对象(中)
c++·笔记
YouonlyliveonceC16 小时前
《大话数据结构》第4章实战:中缀表达式转后缀 + 后缀表达式求值(完整可运行实现)
算法
phoenix@Capricornus17 小时前
从统计决策到贝叶斯估计
人工智能·算法·机器学习
AICDragon17 小时前
1.8%就够了:K3的896个MoE专家,为什么激活率这么低反而是好事?
人工智能·算法
VALENIAN瓦伦尼安教学设备17 小时前
ASHOOTER激光对中仪如何通过颜色确定调整是否合适
数据库·嵌入式硬件·算法
货拉拉技术17 小时前
重塑 Agent 度量衡:基于 LLM-as-a-Judge 的离线评估体系与实践
算法·设计模式