\(0.\) RMQ问题

P1816

人话翻译

给定一个长度为\(n\)的数列\(a\),然后有\(m\)组询问,每次询问一个区间\([l,r]\)的最小值。

其中\(m,n\leq10^5\)

\(1.\) 暴力做法

很显然,暴力做法就是便历 \(\max\limits_{l\leq i\leq r}a_i\) 。这个做法最坏时间复杂度将会高达\(O(n^2)\)。很显然,这对于\(1e5\)的数据范围要炸

\(2.\) 正解

线段树

如果不知道什么是线段树,请点击这里 线段树

对于这种区间信息,线段树显然是能够维护的。但鉴于本题没有区间修改,线段树显然有点大材小用,并且数组模拟的线段树空间将会达到\(O(4n)\)

线段树还有一些缺点,就是它的查询时间复杂度最坏是\(O(logn)\)的,因为没有区间修改,这个时间开销也略微有点大。

\(ST\)表(倍增)

倍增算法的含义就是成倍增长。我们考虑一个这样的数据结构:

一个二维数组\(st\),其中

\[st_{i,j}=\min\limits_{i\leq k\leq i+2^j}a_k
\]

我们假设一个数据:\(9\ 3\ 1\ 7\ 5\ 6\ 0\ 8\)

可以建立如下所示的\(ST\)表:

建表

我们发现,我们可以一层层地建表。这样,我们就可以通过递推,利用上层的信息,建表。

我们先将读入数据存在\(0\)这一行。

我们发现,要想实现建立这个表,我们需要每次倍增长度。而最简单的倍增长度方法就是将两段不相交的区间合并起来。

所以我们可以得到如下公式:

\[st_{i,j}=min(st_{i,j-1},st_{i+2^{j-1},j-1}
\]

这样,我们就能完成建表

for(rg int i=1;i<=16;i++){ // 由计算器可得 log1e5 约为 17,但是这里循环16次已经够了。
for(rg int j=1;j+(1<<i)-1<=n;j++){
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
}
}
  • 注:为了方便,我们常常把这个表“竖”过来。本篇中的代码一律如此

我们可以发现,建表的时间复杂度是\(O(nlogn)\)的

查询

我们由上表知道,想要查询\([l,r]\)的最值,只需求出

\[min(st_{l,log(len)},st_{r-2^{log(len)+1},log(len)})
\]

其中

\[len=r-l+1
\]

比如上方的数据,我们想要查询\([3,8]\)

我们只需要从\(3\)往后\(4\)个,\(8\) 往前\(4\)个,肯定能够完全覆盖这个区间

所以我们的查询开销是\(O(1)\)的

ans=min(st[(int)log2(len)][l],st[(int)log2(len)][r-(1<<((int)log2(len)))+1]);

至此,我们已经完成了全部内容

【算法学习笔记】RMQ问题与ST表的更多相关文章

  1. 某科学的PID算法学习笔记

    最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...

  2. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  3. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  4. Johnson算法学习笔记

    \(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...

  5. Johnson 全源最短路径算法学习笔记

    Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...

  6. 【模板】RMQ问题的ST表实现

    $RMQ$问题:给定一个长度为$N$的区间,$M$个询问,每次询问$[L_i,R_i]$这段区间元素的最大值/最小值. $RMQ$的高级写法一般有两种,即为线段树和$ST$表. 本文主要讲解一下$ST ...

  7. RMQ问题及ST表

    RMQ(Range Minimum/Maximum Query)问题指的是一类对于给定序列,要求支持查询某区间内的最大.最小值的问题.很显然,如果暴力预处理的话复杂度为 \(O(n^2)\),而此类问 ...

  8. 算法学习笔记:最近公共祖先(LCA问题)

    当我们处理树上点与点关系的问题时(例如,最简单的,树上两点的距离),常常需要获知树上两点的最近公共祖先(Lowest Common Ancestor,LCA).如下图所示: 2号点是7号点和9号点的最 ...

  9. 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)

    题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...

随机推荐

  1. 现代化的拷贝文字---clipboard.js

    参考链接:http://www.clipboardjs.cn/

  2. merge效率

    测试merge效率   测试说明: MERGE是oracle提供的一种特殊的sql语法,非常适用于数据同步场景,即: (把A表数据插到B表,如果B表存在相同主键的记录则使用A表数据对B表进行更新) 数 ...

  3. python 指定文件夹下所有文件(包括子目录下的文件)拷贝到目标文件夹下

    #!/usr/bin/env python3 # -*- coding:utf8 -*- # @TIME :2018/9/17 9:02 # @Author:dazhan # @File :copyf ...

  4. git pull因为主线分支问题解决

    方法1:如果你想保留刚才本地修改的代码,并把git服务器上的代码pull到本地(本地刚才修改的代码将会被暂时封存起来) git stashgit pull origin mastergit stash ...

  5. krpano下全屏后弹窗失效问题解决方法

    原因 krpano 自身的全屏仅全屏自身,以外的html效果将无法显示 解决方法 把全屏按钮换成浏览器自身的全屏效果 解决步骤 vtourskin.xml <layer name="n ...

  6. kafka原理和操作

    参考: 原理: https://www.cnblogs.com/yinzhengjie/p/9780976.html 常用配置参数: https://www.cnblogs.com/yinzhengj ...

  7. vue 事件中的 .native

    vue组件添加事件@click.native native是什么? .native - 监听组件根元素的原生事件. 主要是给自定义的组件添加原生事件. 官网的解释: 你可能想在某个组件的根元素上监听一 ...

  8. java水题集

    POJ - 1220 进制转换 import java.io.*; import java.util.*; import java.math.*; public class Main { public ...

  9. laravel框架之自帶登錄&註冊

    //控制器層 <?php namespace App\Http\Controllers\admin; use App\Models\admin\Users; use Illuminate\Htt ...

  10. Java IO与NIO的总结、比较

    一.IO流总结 1.Java I/O主要包括如下3层次: 流式部分——最主要的部分.如:OutputStream.InputStream.Writer.Reader等 非流式部分——如:File类.R ...