【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

做法&代码

定义 f[i][j] : 从 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;
}
相关推荐
沐苏瑶2 小时前
Java 搜索型数据结构全解:二叉搜索树、Map/Set 体系与哈希表
java·数据结构·算法
ccLianLian2 小时前
深度学习·DDPM
数据结构
ZoeJoy83 小时前
算法筑基(二):搜索算法——从线性查找到图搜索,精准定位数据
算法·哈希算法·图搜索算法
Alicx.3 小时前
dfs由易到难
算法·蓝桥杯·宽度优先
桦03 小时前
【C++复习】:继承
开发语言·c++
_日拱一卒3 小时前
LeetCode:找到字符串中的所有字母异位词
算法·leetcode
鱼难终4 小时前
类和对象(下)
c++
云泽8084 小时前
深入 AVL 树:原理剖析、旋转算法与性能评估
数据结构·c++·算法
Wilber的技术分享5 小时前
【LeetCode高频手撕题 2】面试中常见的手撕算法题(小红书)
笔记·算法·leetcode·面试
邪神与厨二病5 小时前
Problem L. ZZUPC
c++·数学·算法·前缀和