题目:

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

第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

共Q行,对应每一个查询区间的最大值。

Input示例

5

1

7

6

3

1

3

0 1

1 3

3 4

Output示例

7

7

3

分析:

经典的RMQ问题了。

令 d(i, j) 表示从 i 开始, 长度为 2 ^ j 的一段元素的中的最大值, 则可以用递推的方法计算

d(i, j) : d(i, j) = max{ d(i, j-1), d(i + 2^j-1, j-1) }

如此一来就预处理完了。

查询操作就比较简单了:

令 k 为 2 ^ k <= (R - L + 1) 的最大整数。 则【 L, R】 区间就可以分为 【L, L+2^k】, 【R-2^k+1, R】 两个区间了,取最大值就好了。 (重复元素对于最大最小是没有影响的)。

实现:

#include <bits/stdc++.h>

using namespace std;

const int maxn = 10000 + 131;

int Num[maxn], RMQ[maxn][20];
int N, Q, L, R; void RMQ_INIT(int n) {
for(int i = 0; i < n; ++i) RMQ[i][0] = Num[i];
for(int j = 1; (1<<j) <= n; ++j)
for(int i = 0; i + (1<<j) - 1 < n; ++i)
RMQ[i][j] = max(RMQ[i][j-1], RMQ[i + (1<<(j-1))][j-1]);
} int Find(int L, int R) {
int k = 0;
while((1<<(k+1)) <= R-L+1) k++;
return max(RMQ[L][k], RMQ[R-(1<<k)+1][k]);
} int main() {
while(cin >> N) {
memset(RMQ, 0, sizeof(RMQ));
for(int i = 0; i < N; ++i) cin >> Num[i];
RMQ_INIT(N);
cin >> Q;
while(Q--) {
cin >> L >> R;
cout << Find(L, R) << endl;
}
}
}

51nod--1174 区间中最大的数 (RMQ)的更多相关文章

  1. 51Nod 1174 区间中最大的数(RMQ)

    #include <iostream> #include <algorithm> #include <cstring> using namespace std; + ...

  2. 51nod(1174 区间中最大的数)(ST表模板题)

    1174 区间中最大的数 1.0 秒 131,072.0 KB 0 分 基础题   给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 ...

  3. 51Nod 1174 区间中最大的数

    给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少.   例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数为7. ...

  4. 51nod 1174 区间中最大的数(送盾题)

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. ...

  5. 51nod——1174 区间中最大的数(ST)

    题目链接 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数 ...

  6. (DP ST表 线段树)51NOD 1174 区间中最大的数

    给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少.   例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数为7. ...

  7. 51Nod—1174 区间中最大的数 线段树模版

    在大佬们题解的帮助下算是看懂了线段树吧...在这mark下防一手转头就忘. #include<iostream> #include<stdio.h> using namespa ...

  8. 51nod 1174 1174 区间中最大的数

    题目链接:51nod 1174 1174 区间中最大的数 ST(Sparse Table)算法学习参考博客:http://blog.csdn.net/niushuai666/article/detai ...

  9. 51nod1174区间中最大的数

    1174 区间中最大的数基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中, ...

随机推荐

  1. vs2015第二次装安装不能选择路径问题解决方法

    vs2015卸载后注册表还会存在vs2015的信息,下次安装的时候会读注册表里面记录的路径,不能自己选择路径. 解决方法: 1.在vs安装文件的路径打开命令,shift+鼠标右键 2.输入命令:cn_ ...

  2. xgboost 参数调优指南

    一.XGBoost的优势 XGBoost算法可以给预测模型带来能力的提升.当我对它的表现有更多了解的时候,当我对它的高准确率背后的原理有更多了解的时候,我发现它具有很多优势: 1 正则化 标准GBDT ...

  3. css3 animation(左右摆动) (放大缩小)

    左右摆动: @-webkit-keyframes roundRule{ 0%, 100%{ -webkit-transform: rotate(-15deg); } 50%{ -webkit-tran ...

  4. NOIP2000提高组复赛C 单词接龙

    题目链接:https://ac.nowcoder.com/acm/contest/248/C 题目大意: 略 分析: 注意点:1.前缀和后缀的公共部分应该选最短的.2.如果两个字符串前缀和后缀的公共部 ...

  5. vue报错Error in render: "TypeError: Cannot read property '0' of undefined"

    通常有两种情况: 1.在模板的html标签上使用length报错 vue 中使用 length判断的时候,有时会报错,如下: <div class="item_list" v ...

  6. Python中的可视化神器:pyecharts

    pyecharts是一款将python与echarts结合的强大的数据可视化工具,本文将为你阐述pyecharts的使用细则 前言 我们都知道python上的一款可视化工具matplotlib,而前些 ...

  7. CodeSmith如何生成实体类 ,完善版

    <%-- Name: Database Table Properties Author: Paul Welter Description: Create a list of properties ...

  8. Python——Microsoft Office编程

    一.Excel 需要安装xlrd和xlwt这两个库   1.打开excel readbook = xlrd.open_workbook(r'\test\canying.xlsx') 2.获取读入的文件 ...

  9. spring中设计模式

    MVC模式 Model:pojo.数据库交互(业务数据和业务逻辑) View:Jsp(与用户交互页面) Controller:控制器(接收请求并决定调用哪个模块组件去处理请求,然后决定调用哪个视图(通 ...

  10. 舵机&数据处理&stm32内存之堆栈溢出(遇到的问题)

    产品名称:TOWER PRO(辉盛)大扭力舵机MG996R (MG995升级产品)6v/11Kg厂家编号:MG996R产品净重: 55g产品尺寸: 40.7*19.7*42.9mm产品拉力: 9.4k ...