【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记录1,AC记录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;
}
相关推荐
一去不复返的通信er15 分钟前
力扣-图论-岛屿数量
算法·leetcode·图论
青瓦梦滋1 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
程序 代码狂人3 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade4 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
小郎君6586 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
算法
CodeYp20196 小时前
第15讲:二叉搜索树
开发语言·c++·二叉搜索树
邵奈一6 小时前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法
RaaS1006 小时前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法
shehuiyuelaiyuehao7 小时前
算法56,重排链表
数据结构·算法·链表