1541:【例 1】数列区间最大值

时间限制: 1000 ms         内存限制: 524288 KB
提交数: 600     通过数: 207

【题目描述】

输入一串数字,给你 MM 个询问,每次询问就给你两个数字 X,YX,Y,要求你说出 XX 到 YY 这段区间内的最大数。

【输入】

第一行两个整数 N,MN,M 表示数字的个数和要询问的次数;

接下来一行为 NN 个数;

接下来 MM 行,每行都有两个整数 X,YX,Y。

【输出】

输出共 MM 行,每行输出一个数。

【输入样例】

10 2
3 2 4 5 6 8 1 2 9 7
1 4
3 8

【输出样例】

5
8

【提示】

数据范围与提示:

对于全部数据,1≤N≤105,1≤M≤106,1≤X≤Y≤N1≤N≤105,1≤M≤106,1≤X≤Y≤N。数字不超过 C/C++C/C++ 的 intint 范围。

【来源】http://ybt.ssoier.cn:8088/problem_show.php?pid=1541

解析:  这是指求区间最值的模板问题,这里采用 ST算法来实现,总的时间复杂度O(nlogn+Q)

倍增思想:

f[i][j]表示i开始的连续2j 个点的最大值。

则f[i][0]表示i开始连续1个点的最大值即a[i];

f[i][1]表示i开始连续2个点的最大值即a[i]和a[i+1]的最大值;

f[i][2]表示i开始连续4个点的最大值即a[i]~a[i+3]中的最大值;

f[i][3]表示i开始连续8个点的最大值即a[i]~a[i+7]中的最大值;

......

f[i][log(n)/log(2)开始连续n个点的最大值即 a[i]~a[i+n-1];(i+n-1<=n)

      f[1][0]=a[1]=3;         f[2][0]=a[2]=2;         f[3][0]=a[3]=4;         f[4][0]=a[4]=5;         f[5][0]=a[5]=6;         f[6][0]=a[6]=8;         f[7][0]=a[7]=1;         f[8][0]=2;         f[9][0]=9;         f[10][0]=7;  
 f[1][1]=max(f[1][0],f[2][0])=3  f[2][1]=max(f[2][0],f[3][0])=4  f[3][1]=max(f[3][0],f[4][0])=5  f[4][1]=max(f[4][0],f[5][0])=6  f[5][1]=max(f[5][0],f[6][0])=8 f[6][1]=8 f[7][1]=2  f[8][1]=9  f[9][1]=9  
 f[1][2]=max(f[1][1],f[3][1])=4   f[2][2]=max(f[2][1],f[4][1])=6   f[3][2]=max(f[3][1],f[5][1])=8   f[4][2]=max(f[4][1],f[6][1])=8  f[5][2]=max(f[5][1],f[7][1])= 8 f[6][2]=9 f[7][2]=9      
 f[1][3]=max(f[1][2],f[5][2])=8 f[2][3]=max(f[2][2],f[6][2])=9 f[3][3]=max(f[3][2],f[7][2])=9              
                   
                   
                   
                   
                   
                   

ST:

void st(){  //时间复杂度O(nlogn)

int k=log(n)/log(2);//求深度
for(int i=1;i<=n;i++)f[i][0]=a[i];//初始化
for(int j=1;j<=k;j++)
for(int i=1;i+(1<<j)-1<=n;i++)//长度为2^j的区间[i,i+2^j-1] ,所以当i+(1<<j)-1>n时循环停止
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}

RMQ(Range Minimum/Maximum Query)问题 //区间最值查询:

int qwt(int L,int R){//时间复杂度O(1)

int k=log(R-L+1)/log(2);//2k<=R-L+1,但2*2k>R-L+1
return max(f[L][k],f[R-(1<<k)+1][k]);//L+2k-1<=R,R-2k+1>=L,所以区间[L,L+2k-1]和[,R-2k+1,R]是正好相切或者有部分重合,也就是说两个区间是无缝衔接的,这样求两个区间最值的最值就是所求答案。
}

L=1,R=4时 求的是  max(f[1][2],f[1][2]) 即区间【1,4】【1,4】

L=3,R=8时 求的是  max(f[3][2],f[6][2])即区间【3,6】【5,8】,两个区间中5,6是重合的

L=1,R=10时 求的是  max(f[1][3],f[3][10])即区间【1,8】【3,10】,两个区间中3~8是重合的

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
const int maxn=;
int n,m;
int f[maxn][],a[maxn];
void st(){
int k=log(n)/log();
for(int i=;i<=n;i++)f[i][]=a[i];
for(int j=;j<=k;j++)
for(int i=;i+(<<j)-<=n;i++)//长度为2^j的区间[i,i+2^j-1]
f[i][j]=max(f[i][j-],f[i+(<<(j-))][j-]);
}
int qwt(int L,int R){
int k=log(R-L+)/log();
return max(f[L][k],f[R-(<<k)+][k]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
st();
for(int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",qwt(x,y));
}
return ;
}

注意:当输入输出数据的规模达到10的6次方时,就需要用scanf和pritf输入输出。此时用cin和cout是绝对会超时的。

ST (Sparse Table:稀疏表)算法的更多相关文章

  1. RMQ(ST(Sparse Table))(转载)

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...

  2. 稀疏表(ST / Sparse Table)

    RMQ问题: 给定一个序列,每次询问一个区间最小值 / 最大值. 没有修改. //拿区间最大值来举例. memset(ans, -INF, sizeof(ans)); for (int i = 1; ...

  3. RMQ (Range Minimal Query) 问题 ,稀疏表 ST

    RMQ ( 范围最小值查询 ) 问题是一种动态查询问题,它不需要修改元素,但要及时回答出数组 A 在区间 [l, r] 中最小的元素值. RMQ(Range Minimum/Maximum Query ...

  4. codeforce 359D 二分+ 动态规划(sparse table)

    原题链接:http://codeforces.com/problemset/problem/359/D 思路:首先对符合题目的长度(r-l)从0到n-1进行二分查找,对每一个长度进行check,看是否 ...

  5. 算法学习 - ST表 - 稀疏表 - 解决RMQ问题

    2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ...

  6. RMQ ---- ST(Sparse Table)算法

    [概述]      RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返 ...

  7. 基于稀疏表(Sparse Table)的RMQ(区间最值问题)

    在RMQ的其他实现方法中,有一种叫做ST的算法比较常见. [构建] dp[i][j]表示的是从i起连续的2j个数xi,xi+1,xi+2,...xi+2j-1( 区间为[i,i+2j-1] )的最值. ...

  8. 动态规划——稀疏表求解RMQ问题

    RMQ (Range Minimum/Maximum Query)问题,即区间最值查询问题,是求解序列中的某一段的最值的问题.如果只需要询问一次,那遍历枚举(复杂度O(n))就是最方便且高效的方法,但 ...

  9. 一维二维Sparse Table

    写在前面: 记录了个人的学习过程,同时方便复习 Sparse Table 有些情况,需要反复读取某个指定范围内的值而不需要修改 逐个判断区间内的每个值显然太浪费时间 我们希望用空间换取时间 ST表就是 ...

随机推荐

  1. rabbitmq笔记(一)rabbitmq简介及基础

    一.消息组件 如果从消息组件来讲主要划分位两类: 1.JMS组件:ActiveMQ(慢): 2.AMQP组件(协议):性能是最高的, 而AMQP有两个主要的开源: 1)RabbitMQ:使用最广泛,速 ...

  2. Python面向对象Day2

    一.组合 给一个类的对象分组一个属性,这个属性是另一个类的对象 意义:让类的对象与另一个类的对象产生关系,也叫类与类之间产生关系(继承也能) 好处: ① 让两个类之间产生关系 ② 某一个对象是独立存在 ...

  3. 一份数据分析学习清单.xls

    今天给大家整理一份数据分析的学习清单,打算了解学习这方面的同学可以看看,基本上大的需要学习的点都有涉及:具体细节知识的学习建议大家亲自去动手制作思维导图,自己动手梳理知识脉络. 上期入口:18个堪称神 ...

  4. 【20191118会议】针对华为云CCE 问题总结

    针对华为云CCE问题总结 如何购买CCE集群 可以分为测试环境和生产环境,针对使用范围进行购买集群. 测试环境 可以进行公用 生产环境建议使用单独集群 尤其针对部门大 耦合性不高 ,生产环境 建议使用 ...

  5. css定位篇

    1.浮动的特性: 1.浮动的元素脱标 2.浮动的元素互相贴靠 3.浮动的元素有“字围”效果 4.收缩的效果 前提是标准文档流,margin的垂直方向会出现塌陷问题. 如果盒子居中:margin:0 a ...

  6. P1363 幻象迷宫[搜索]

    题目描述 (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫.) WD:呜呜,肿么办啊-- LHX:momo...我们一定能走出去的! WD:嗯,+U+U ...

  7. 《hello--world团队》第六次作业:团队项目系统设计改进与详细设计

    项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十 团队作业6:团队项目系统设计改进与详细设计 团队名称 <hello--wo ...

  8. String字符串常量池简介

    直接贴代码---> public class Test { public static void main(String[] args) { /** * 为了提升字符串的访问效率,在程序中使用了 ...

  9. 51、[源码]-Spring容器创建-容器创建完成

    51.[源码]-Spring容器创建-容器创建完成 12.finishRefresh();完成BeanFactory的初始化创建工作:IOC容器就创建完成: 1).initLifecycleProce ...

  10. Python3连接MySQL数据库实战

    Python3连接MySQL数据库实战 第三方库 :pymysql 数据库连接 def connect(): try: #建立数据库连接,从左至右参数依次为 # ip地址 我用的是云端数据库 如果为本 ...