51nod——1174 区间中最大的数(ST)
给出一个有N个数的序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,最大的数是多少。
输入
第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)
输出
共Q行,对应每一个查询区间的最大值。
输入样例
5
1
7
6
3
1
3
0 1
1 3
3 4
输出样例
7
7
3
Sparse Table解决Range Minimum/Maximum Query学习参考博客
分析
ST用DP O(nlogn)预处理 ,O(1)查询。
设a[i]是要求区间最值的数列,RMQ[i, j]表示从第i个数起连续2^j个数中的最大值。
例如:
a数列为:3 2 4 5 6 8 1 2 9 7
RMQ[1,0]表示第1个数起,长度为2^0=1的最大值,其实就是3这个数。同理 RMQ[1,1] = max(3,2) = 3, RMQ[1,2]=max(3,2,4,5) = 5,RMQ[1,3] = max(3,2,4,5,6,8,1,2) = 8;
且[i,0]就等于a[i]。
状态转移方程RMQ[i, j]=max(RMQ[i,j-1], RMQ[i + 2^(j-1),j-1])。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define maxn 10005
using namespace std; int a[maxn],RMQ[maxn][]; void RMQ_INIT(int n){
for(int i = ; i < n; ++i) RMQ[i][] = a[i];
for(int j = ; (<<j) <= n; ++j)
for(int i = ; i + (<<j) - < n; ++i)
RMQ[i][j] = max(RMQ[i][j-], RMQ[i + (<<(j-))][j-]);
} int Find(int L, int R){
int k = ;
while((<<(k+)) <= R-L+) k++;
return max(RMQ[L][k], RMQ[R-(<<k)+][k]);
} int main(){
int N,Q,L,R;
while(cin>>N){
memset(RMQ, , sizeof(RMQ));
for(int i=;i<N;++i) cin>>a[i];
RMQ_INIT(N);
cin>>Q;
while(Q--){
cin>>L>>R;
cout<<Find(L,R)<<endl;
}
}
return ;
}
51nod——1174 区间中最大的数(ST)的更多相关文章
- 51nod(1174 区间中最大的数)(ST表模板题)
1174 区间中最大的数 1.0 秒 131,072.0 KB 0 分 基础题 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 ...
- (DP ST表 线段树)51NOD 1174 区间中最大的数
给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数为7. ...
- 51Nod 1174 区间中最大的数
给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数为7. ...
- 51nod 1174 区间中最大的数(送盾题)
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. ...
- 51Nod—1174 区间中最大的数 线段树模版
在大佬们题解的帮助下算是看懂了线段树吧...在这mark下防一手转头就忘. #include<iostream> #include<stdio.h> using namespa ...
- 51Nod 1174 区间中最大的数(RMQ)
#include <iostream> #include <algorithm> #include <cstring> using namespace std; + ...
- 51nod 1174 1174 区间中最大的数
题目链接:51nod 1174 1174 区间中最大的数 ST(Sparse Table)算法学习参考博客:http://blog.csdn.net/niushuai666/article/detai ...
- 51nod1174区间中最大的数
1174 区间中最大的数基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中, ...
- 51nod--1174 区间中最大的数 (RMQ)
题目: 1174 区间中最大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j ...
随机推荐
- shell学习(1)
#!/bin/bash #######read从屏幕输入######## echo "what is your name?" read PERSON echo "Hell ...
- Tinghua Data Mining 7
SVM B分割得更加无偏 比较公平 卡着分界面的点叫支持向量,就好比托着分界面 支持向量决定了可移动的范围,这个范围就叫margin 分界面可移动的距离 前提是先要被分对 对偶问题一般是不等价的,但是 ...
- bryce1010专题训练——Splay树
Prob Hint BZOJ 3323 文艺平衡树 区间翻转 BZOJ 1251 序列终结者 区间翻转,询问最值 BZOJ 1895 supermemo 区间加,翻转,剪切,询问最值.点插入,删除. ...
- linux 打开FTP 功能
http://blog.csdn.net/jay285979220/article/details/62216622 今天在linux上安装完了vsftpd后,使用root账号一直无法登陆到服务器上. ...
- opencart 安装
1:安装 php5 apache2 mysql 2:下载opencart wget https://github.com/opencart/opencart/archive/master.zi ...
- ubuntu触摸板关闭开启
sudo rmmod psmouse #用来禁用触摸板 sudo modprobe psmouse #用来启用触摸板
- 实战:mysql写存储过程并定时调用
有表:cap_meter_detail 字段:recordtime 情景:recordtime每半个小时记录一次,故一天会产生很很多数据,我们要做的是,每天00:00:00对cap_meter_det ...
- bootstrap-table 基础用法
1.需要添加的引用. <script src="@Url.Content("~/js/jquery-2.1.1.js")"></script& ...
- [BZOJ2434][Noi2011]阿狸的打字机 AC自动机+树状数组+离线
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2434 题目中这种多个串匹配的问题,一下子就想到了AC自动机.然后发现如果要建立AC自动机, ...
- Android学习总结(十一)———— Adapter的使用
一.Adapter的基本概念 UI控件都是跟Adapter(适配器)打交道的,了解并学会使用这个Adapter很重要, Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式 ...