比赛当中,常会出现RMQ问题,即求区间最大(小)值。我们该怎样解决呢?

主要方法有线段树、ST、树状数组、splay。


例题

题目描述

2008年9月25日21点10分,酒泉卫星发射中心指控大厅里,随着指挥员一声令下,长征二号F型火箭在夜空下点火起飞,神舟七号飞船载着翟志刚、刘伯明、景海鹏3位航天员,在戈壁茫茫的深邃夜空中飞向太空,开始人类漫步太空之旅。第583秒,火箭以7.5公里/秒的速度,将飞船送到近地点200公里、远地点350公里的椭圆轨道入口。而此时,火箭的燃料也消耗殆尽,即将以悲壮的方式与飞船告别。这个过程,在短短不到10分钟时间内,翟志刚和他的两名战友体会到了从超重到失重的过程。

除了超重和失重的感觉之外,就是浩瀚的长空中璀璨的星星,和地面上看到的星星不同,在太空中看到的星星是成一条直线的,一共有N(1<=N<=100,000)颗星星,编号为1到N,每个星星有自己的体积,由于在飞船中很无聊,除了不停地玩弄手中失重的书和笔之外没有别的事可干,此时翟志刚说我们来玩游戏吧,一共玩了M轮(1<=M<=100,000),每一轮都是给出两个整数L和R(1<=L<=R<=N),询问第L到第R颗星星之间最大星星的体积,每次答对的人就可以多休息一段时间。

由于翟志刚还要进行太空漫步,所以他现在请你帮忙,你得到的回报就是太空饼干。

输入

第一行输入N,M

接下来一行N个整数,表示星星的体积(1<=体积<=maxlongint)

接下来M行,每行两个整数L_i,R_i,表示询问区间。

输出

输出M行,每一行表示询问区间L_i到R_i之间最大星星的体积。

样例输入

6 3

5 7 3 9 2 10

1 3

2 4

3 6

样例输出

7

9

10

提示

【数据说明】

50%的数据满足1<=N,M<=5000


这题是一个裸RMQ题,就是给你一个数列,每次求一个区间中的最大值。

可以用ST算法做。

ST算法

这其实是一个DP。设f[i][j]表示以j~j+2^i-1的区间的最大值。

初始化:f[0][j]=a[j]

方程:f[i][j]=max(f[i-1][j],f[i-1][j+2^(i-1)])

原因其实很好理解,就是将两个小区间合并,成为一个大区间。



那怎么询问?

假设询问[l,r],

我们可以以l为起点取个最大区间,再从r为终点取个最大区间,两个区间合在一起就是[l,r]这个区间了。

怎么取?

设k=int(log2(r-l+1))

那么query(l,r)=max(f[k][l],f[k][r-2^k+1])



两个区间合起来一定是[l,r],因为它们的长度至少是[l,r]的一半(如果不到一半,它还可以扩大两倍。然而这应该是最大的区间),两边合起来一定是[l,r]。

时间复杂度:O(NlgN+Q) Q为询问次数

空间复杂度:O(NlgN)


代码实现

实现很简单,这里只写重要部分(我不会告诉你我曾是用Pascal打的,用C++打的那个是线段树)

预处理

for (i=1;i<=n;++i)
f[0][i]=a[i];
for (i=1;i<=int(log2(n));++i)
for (j=1;j<=n-(1>>i)+1;++j)
f[i][j]=max(f[i-1][j],f[i-1][j+(1<<i-1)]);

询问

int query(int l,int r)
{
int k=int(log2(r-l+1));
return max(f[k][l],f[k][r-(1>>k)+1]);
}

RMQ问题——ST算法的更多相关文章

  1. RMQ的ST算法

    ·RMQ的ST算法    状态设计:        F[i, j]表示从第i个数起连续2^j个数中的最大值    状态转移方程(二进制思想):        F[i, j]=max(F[i,j-1], ...

  2. RMQ(ST算法)

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

  3. RMQ之ST算法模板

    #include<stdio.h> #include<string.h> #include<iostream> using namespace std; ; ],M ...

  4. RMQ问题+ST算法

    一.相关定义 RMQ问题 求给定区间的最值: 一般题目给定许多询问区间. 常见问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大 ...

  5. [总结]RMQ问题&ST算法

    目录 一.ST算法 二.ST算法の具体实现 1. 初始化 2. 求出ST表 3. 询问 三.例题 例1:P3865 [模板]ST表 例2:P2880 [USACO07JAN]平衡的阵容Balanced ...

  6. RMQ问题ST算法 (还需要进一步完善)

    /* RMQ(Range Minimum/Maximum Query)问题: RMQ问题是求给定区间中的最值问题.当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的 ...

  7. RMQ 问题 ST 算法(模板)

    解决区间查询最大值最小值的问题 用 $O(N * logN)$ 的复杂度预处理 查询的时候只要 $O(1)$ 的时间  这个算法是 real 小清新了   有一个长度为 N 的数组进行 M 次查询 可 ...

  8. RMQ之ST算法

    #include <stdio.h> #include <string.h> ; int a[N]; ]; inline int min(const int &a, c ...

  9. Round #4 RMQ问题ST算法

    前几天群里看到有人问[JSOI2008]最大数,一道很简单的问题,线段树无脑做,但是看到了动态ST,emmm,学学吧,听大佬说了下思路,还好,不难的: 四道题都可以用其他数据结构或做法代替,例如线段树 ...

随机推荐

  1. 简介Python正则表达式

    一.概念 简单来说正则表达式是由一些普通字符(例如,a 到 z 之间的字母)和一些元字符组成,用来匹配和过滤一些字符串的一种逻辑公式. 二.正则表达式的一些基本规则 1.一些常用的元字符   ^  : ...

  2. 6 Accessing and Managing Symbols with armlink

    6.4 Image$$ execution region symbols The linker generates Image$$ symbols for every execution region ...

  3. 使用豆瓣源安装python包

    Python pip安装的原理就是从Python的官方源https://pypi.python.org/pypi下载到本地安装, 但是访问官方源网络不稳定,速度较慢,我经常会遇到一个问题,pip安装包 ...

  4. markdown转为pdf文件

    要求: 把.md格式转为.pdf格式,并批量处理,最后将多个pdf文件合并为一个pdf并以文件名作为书签名 解决思路: 1.md格式的markdown文件转为html 为了将 md 格式转换成 htm ...

  5. SSM 整合 Shiro

    1. 导包 <!-- spring --> <dependency> <groupId>org.springframework</groupId> &l ...

  6. C++数据类型之字符型&转义字符

    字符型 **作用:** 字符型变量用于显示单个字符 **语法:**  char ch = 'a'; > 注意1:在显示字符型变量时,用单引号将字符括起来,不要用双引号 > 注意2:单引号内 ...

  7. Codeforces Round #526 D - The Fair Nut and the Best Path /// 树上两点间路径花费

    题目大意: 给定一棵树 树上每个点有对应的点权 树上每条边有对应的边权 经过一个点可得到点权 经过一条边必须花费边权 即从u到v 最终得分=u的点权-u到v的边权+v的点权 求树上一条路径使得得分最大 ...

  8. CSIC_716_20191107【深拷贝、文件的编码解码、文件的打开模式】

    深拷贝和浅拷贝 列表的拷贝,用copy方法浅拷贝,新列表和被拷贝列表的id是不一样的. list1 = [1, 'ss', (5, 6), ['p', 'w','M'], {'key1': 'valu ...

  9. Remember, every day is a miracle.

    Remember, every day is a miracle.请记住,每一天都是一个奇迹.

  10. Arthas 3.1.2 版本发布 | 增加 logger/heapdump/vmoption 命令

    最近偶尔有用户反馈某些 HTTP 接口出现超时问题,而 web 服务端的 Trace 监控没有出现 http 返回值为 503 等异常情况.出现这种情况一般是web容器出现问题,客户端连 Arthas ...