首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【51Nod】1174 - 区间中最大的数(RMQ)

【51Nod】1174 - 区间中最大的数(RMQ)

作者头像
FishWang
发布2025-08-27 10:24:57
发布2025-08-27 10:24:57
11100
代码可运行
举报
运行总次数:0
代码可运行

点击打开题目

1174 区间中最大的数

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

收藏

关注

给出一个有N个数的序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,最大的数是多少。

例如: 1 7 6 3 1。i = 1, j = 3,对应的数为7 6 3,最大的数为7。(该问题也被称为RMQ问题)

Input

代码语言:javascript
代码运行次数:0
运行
复制
第1行:1个数N,表示序列的长度。(2 <= N <= 10000)
第2 - N + 1行:每行1个数,对应序列中的元素。(0 <= S[i] <= 10^9)
第N + 2行:1个数Q,表示查询的数量。(2 <= Q <= 10000)
第N + 3 - N + Q + 2行:每行2个数,对应查询的起始编号i和结束编号j。(0 <= i <= j <= N - 1)

Output

代码语言:javascript
代码运行次数:0
运行
复制
共Q行,对应每一个查询区间的最大值。

Input示例

代码语言:javascript
代码运行次数:0
运行
复制
5
1
7
6
3
1
3
0 1
1 3
3 4

Output示例

代码语言:javascript
代码运行次数:0
运行
复制
7
7
3

总感觉ST算法像区间dp。

代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
int dp[10011][30];
int n;
int num[10011];
void RMQ()
{
	for (int i = 1 ; i <= n ; i++)
		dp[i][0] = num[i];		//初始化独立的数
	for (int i = 1 ; (1 << i) <= n ; i++)
	{
		for (int j = 1 ; j + (1 << i) - 1 <= n ; j++)
		{
			dp[j][i] = max (dp[j][i-1] , dp[j+(1<<(i-1))][i-1]);
		}
	}
}
int main()
{
	scanf ("%d",&n);
	for (int i = 1 ; i <= n ; i++)
		scanf ("%d",&num[i]);
	RMQ();
	int Q;
	int x,y;
	int l,ans;
	scanf ("%d",&Q);
	while (Q--)
	{
		scanf ("%d %d",&x,&y);
		x++ , y++;		//我是从1开始存数的,所以都加1 
		l = log(y-x+1) / log(2.0);
		ans = max(dp[x][l] , dp[y-(1<<l)+1][l]);
		printf ("%d\n",ans);
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档