RMQ问题【模板】
概念
RMQ 是英文 Range Maximum/Minimum Query 的缩写,表示区间最大(最小)值。
解决 RMQ 问题的主要方法有两种,分别是 ST 表和线段树。本文主要讲 ST 表。
ST表
$ST$ 表,即 $Sparse-Table$ 算法,它预处理的时间是 $O(nlogn)$,但是查询时间只需要 $O(1)$,且常数非常小。但是不支持修改操作。最重要的是,这个算法非常好写,并且不容易出错。
$ST$ 表是基于倍增思想,令 $d(i, j)$ 表示从 $i$ 开始的,长度为 $2^j$的一段元素中的最小值,则可以用推递的方式计算 $d(i, j)$:$d(i, j) = max\{d(i,j-1), d(i + 2^{j-1}, j-1) \}$,$f[i][0] = a[i]$,即把待查询区间平均分成了两部分。
注意 $2^j \leq n$,因此 $d$ 数组中的元素个数不超过 $n log n$,而每一项都可以在常数时间内计算完成,故总时间为 $O(n log n)$。
ST表模板题
题目描述:给定一个长度为 $N$ 的数列,和 $M$ 次查询,求出每次查询的区间内数字的最大值。
分析:由于时限很紧,需要预处理log,将每次查询的复杂度从 $O(logn)$ 降至 $O(1)$.
代码:
#include<bits/stdc++.h>
using namespace std; const int logn = ; //log n
const int maxn = * + ;
int a[maxn], f[maxn][logn], Logn[maxn];
int n, m; //n个元素,m次查询 inline int read()
{
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
void pre()
{
Logn[] = ;
Logn[] = ;
for(int i = ;i < maxn;i++) Logn[i] = Logn[i/] + ;
}
void RMQ_init()
{
pre();
for(int j = ;j <= logn;j++)
for(int i = ;i + ( << j) - <= n;i++)
f[i][j] = max(f[i][j-], f[i + ( << (j-))][j-]);
}
int RMQ(int L, int R)
{ int s = Logn[R - L + ];
return max(f[L][s], f[R - ( << s) + ][s]);
} int main()
{
n = read(); m = read();
for(int i = ;i <= n;i++) f[i][] = read(); RMQ_init(); for(int i = ;i < m;i++)
{
int x, y;
x = read(); y = read();
printf("%d\n", RMQ(x, y));
}
return ;
}
注意:
- 输入输出数据一般很多,建议开启输入输出优化
- 每次用 std::log 重新计算 log 函数值并不值得,建议采用递推式预处理 $log$
参考链接:https://oi-wiki.org/ds/sparse-table/#__comments
RMQ问题【模板】的更多相关文章
- poj 3264 Balanced Lineup (RMQ算法 模板题)
RMQ支持操作: Query(L, R): 计算Min{a[L],a[L+1], a[R]}. 预处理时间是O(nlogn), 查询只需 O(1). RMQ问题 用于求给定区间内的最大值/最小值问题 ...
- RMQ 2d 模板
#include<iostream> #include<cstdio> #include<string.h> #include<string> #inc ...
- RMQ(模板 ST 区间最值,频繁的间隔时间)
PS: 介绍:http://blog.csdn.net/liang5630/article/details/7917702 RMQ算法.是一个高速求区间最值的离线算法,预处理时间复杂度O(n*log( ...
- ZOJ 2859 二维RMQ(模板)
这题求范围最小值,RMQ正好是用来解决这方面的.所以再适合只是了,又是离线静态输入输出的,所以时间比二维线段树快. #include<iostream> #include<cstdi ...
- rmq问题模板处理
rmq问题: 先贴一下定义 范围最值查询 维基百科,自由的百科全书 范围最值查询(Range Minimum Query),是针对数据集的一种条件查询.若给定一个数组 A[1, n],范围最值查询指定 ...
- RMQ算法模板
分别写了下标从0和1开始的两种 #include<stdio.h> #include<string.h> #include<algorithm> #include& ...
- 倍增算法总结 ( 含RMQ模板)
部分题目来自<算法竞赛设计进阶> 问题 给定一个长度为n的数列A,有m个询问,每次给定一个整数T,求出最大的k,满足a[1],a[2]……a[k]的和小于等于T(不会打sigm ...
- RMQ 模板题 poj 3264
题目:点这里 题意:给一个长度n的数列,然后又Q个询问,问L 到R 中最大值与最小值的差. 分析:RMQ 的模板题. 代码: #include<stdio.h> #include& ...
- LCA和RMQ
下面写提供几个学习LCA和RMQ的博客,都很通熟易懂 http://dongxicheng.org/structure/lca-rmq/ 这个应该是讲得最好的,且博主还有很多其他文章,可以读读,感觉认 ...
- RMQ (Range Minimal Query) 问题 ,稀疏表 ST
RMQ ( 范围最小值查询 ) 问题是一种动态查询问题,它不需要修改元素,但要及时回答出数组 A 在区间 [l, r] 中最小的元素值. RMQ(Range Minimum/Maximum Query ...
随机推荐
- [Asp.Net Core] - 设置 Syncfusion / RichTextEditor 移除超链接及高度自适应 的方法
背景 使用 Syncfusion / RichTextEditor 对录入后的信息进行展示:1. 希望内容高度自适应.2. 希望禁用原文中的超链接. 实现 <div class=" ...
- Zuul【工作原理】
zuul的核心逻辑都是由一系列filter过滤器链实现的,但是filter的类型不同,执行的时机也不同,效果自然也不一样,主要特点如下: filter的类型:filter的类型,决定了它在整个filt ...
- yzoj 2377 颂芬梭哈 题解
题意 Alice 和 Mukyu 最近偶然得到了一本写有一种叫做梭哈的扑克游戏的规则的说明书(名为<C████████nd>,中间部分被涂掉了),据其所述,梭哈是一种使用黑桃.红心.梅花. ...
- 基于TCP的编程
前提:本文基于Linux系统下的学习 服务器端 1 创建通讯端口,返回socket设备的文件描述符 sfdsocket(2)#include <sys/types.h> /* See NO ...
- 全面优化MySQL
MySQL性能瓶颈原因 硬件.系统因素 CPU 磁盘I/O 网络性能 操作系统争用 MySQL相关因素 数据库设计 索引.数据类型 应用程序性能 特定请求.短时事务 配置变量 缓冲区.高速缓存.Inn ...
- ReflectionTest:由输入的类名得到类的信息
package reflection; import java.lang.reflect.*; import java.util.*; public class ReflectionTest { pu ...
- springboot处理事务
ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作: 用来保证一致性,即service方法里的多个dao操作,要么同时 ...
- AJAX 调用WebService 、WebApi 增删改查
WebService 页面: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3 ...
- pip源设置为国内源
windows系统步骤如下: (1)打开文件资源管理器(文件夹地址栏中) (2)地址栏上面输入 %appdata% (3)在这里面新建一个文件夹 pip (4)在pip文件夹里面新建一个文件叫做 pi ...
- c# 事件 +=和-=有什么区别
+=就是發生新事件的同時通知你: -=就是發生新事件的同時不通知你: