序列分块。设块长为 \(B\)。每块预处理出最大值。对于询问 \([l, r]\),答案就是整块最大值和散块最大值拼起来。答案显然是 \(O(n) \sim O(\dfrac{n}{B} + B)\)。这是普通分块。

我们预处理出每个散块的前缀最大值和后缀最大值。预处理线性。对于跨越两个块的询问就是 \(O(\dfrac{n}{B})\)。但是缺点是对于左右端点在一个块内的询问不好处理,复杂度为 \(O(B)\)。根号平衡后还是 \(O(n) \sim O(\sqrt n)\)。

我们开一个数组 \(m_{l, r}\),表示第 \(l\) 个块到第 \(r\) 个块中最大值的最大值。这个数组显然可以很容易的 \(O\left(\left(\dfrac{n}{B}\right)^2 \right)\) 求出。接下来我们预处理所有长度为 \(O(B)\) 的段的最大值。用单调队列也很容易做到 \(O(nB)\)。这样对于左右端点在同一个块内的询问,其长度一定小于 \(B\)。我们可以直接查表。对于跨越多个块的情况,可以查一下 \(m\) 数组。这样复杂度是 \(O\left(\left(\dfrac{n}{B}\right)^2 + nB + n\right) \sim O(1)\) 的。根号平衡一下发现当 \(B = n ^ {1 / 3}\) 的时候有最小值 \(O(n ^ {4 / 3}) \sim O(1)\)。

这似乎是根号算法的极限?

我们考虑 \(\log\) 算法。首先是众所周知的 ST 表。复杂度 \(O(n \log n) \sim O(1)\) ,全方位吊打分块TNT。

我们考虑优化这个算法。考虑分块。不妨还设块长为 \(B\)。散块还是求出前后缀的 \(\max\),整块之间做一下 ST 表。跨越多块的做法可以做到 \(O(\dfrac{n}{B} \log \dfrac{n}{B}) \sim O(1)\)。对于单块之间的询问我们沿袭上面分块的思路,直接预处理所有长度为 \(B\) 的区间的 \(\max\),这样就可以直接查表。所以复杂度就是 \(O(\dfrac{n}{B} \log \dfrac{n}{B} + nB) \sim O(1)\)。根号平衡一下发现当 \(B = \sqrt{\log n}\) 的时候就可以达到 \(O(n \sqrt{\log n}) \sim O(1)\)。这比传统意义上的 ST 表要快了。\(\color{red}{(1)}\)

考虑继续优化这个算法。我们发现瓶颈在处理左右端点在同一块内的答案。在每块内再做一遍 ST 表。这样就需要 \(O(\dfrac{n}{B} \times B \log B) = O(n \log B)\) 的时间。剩下的算法和原来一样。预处理就变成了 \(O(\dfrac{n}{B} \log \dfrac{n}{B} + n \log B)\) 了。我们让 \(B = \log n\) 的时候就已经做到了 \(O(n \log \log n) \sim O(1)\) 了。当然块长显然可以比这个优秀,但是我不会求了。\(\color{orange}{(2)}\)

这个做法不是很好。我认为做法 \(\color{red}{(1)}\) 虽然渐进复杂度更劣但是完全有实力吊打做法 \(\color{orange}{(2)}\)。

如何正确使用 RMQ的更多相关文章

  1. 奶牛排序——RMQ

    [问题描述]奶牛在熊大妈的带领下排成了一条直队.显然,不同的奶牛身高不一定相同……现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛 A 是最矮的,最右边的 B 是最高的,且 B 高于 A ...

  2. Noip模拟50 2021.9.10

    已经好长时间没有考试不挂分的良好体验了... T1 第零题 开场数据结构,真爽 对于这道题首先要理解对于一条链从上向下和从下向上走复活次数相等 (这可能需要晚上躺在被窝里面脑摸几种情况的样例) 然后就 ...

  3. HDU2459 后缀数组+RMQ

    题目大意: 在原串中找到一个拥有连续相同子串最多的那个子串 比如dababababc中的abababab有4个连续的ab,是最多的 如果有同样多的输出字典序最小的那个 这里用后缀数组解决问题: 枚举连 ...

  4. RMQ(ST算法)

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

  5. UVa 12299 RMQ with Shifts(移位RMQ)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New ...

  6. HDU 3183 A Magic Lamp(二维RMQ)

    第一种做法是贪心做法,只要前面的数比后面的大就把他删掉,这种做法是正确的,也比较好理解,这里就不说了,我比较想说一下ST算法,RMQ的应用 主要是返回数组的下标,RMQ要改成<=(这里是个坑点, ...

  7. 【算法】RMQ LCA 讲课杂记

    4月4日,应学弟要求去了次学校给小同学们讲了一堂课,其实讲的挺内容挺杂的,但是目的是引出LCA算法. 现在整理一下当天讲课的主要内容: 开始并没有直接引出LCA问题,而是讲了RMQ(Range Min ...

  8. 洛谷 P4137 Rmq Problem /mex 解题报告

    P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后 ...

  9. 【BZOJ4556】[Tjoi2016&Heoi2016]字符串 后缀数组+二分+主席树+RMQ

    [BZOJ4556][Tjoi2016&Heoi2016]字符串 Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一 ...

  10. 【bzoj1067】[SCOI2007]降雨量 倍增RMQ

    题目描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和200 ...

随机推荐

  1. 【JS设计模式笔记】给我一张名片-工厂方法模式(创建型)

    广告展现 例如,关于计算机培训广告资源需要投放,一批是Java的用绿色字体,一批是PHP的,用黄色字体,红色背景. // 创建Java学科类 var Java = function (content) ...

  2. 深度学习/NLP中的Attention注意力机制

    首先是整体认知,Attention的位置: 传送门1:Attention 机制 传送门2:Attention用于NLP的一些小结 一句话概括:Attention就是从关注全局到关注重点. 借鉴了人类视 ...

  3. Maven 依赖项管理&&依赖范围

    依赖管理   使用坐标导入jar包     1.在pom.xml 中编写 <dependencies> 标签     2.在 <dependencies> 标签中使用 < ...

  4. SpringMVC —— 请求参数(传递json数据)

    接收请求中的json数据             注解       json格式(POJO)    json数组(POJO)    @RequestBody与@RequestParam区别   

  5. eBPF 概述:第 2 部分:机器和字节码

    1. 前言 我们在第 1 篇文章中介绍了 eBPF 虚拟机,包括其有意的设计限制以及如何从用户空间进程中进行交互.如果你还没有读过这篇文章,建议你在继续之前读一下,因为没有适当的介绍,直接开始接触机器 ...

  6. linux内核 快速分片,技术|Linux slabtop命令——显示内核片缓存信息

    Linux内核需要为临时对象如任务或者设备结构和节点分配内存,缓存分配器管理着这些类型对象的缓存.现代Linux内核部署了该缓存分配器以持有缓存,称之为片.不同类型的片缓存由片分配器维护.本文集中讨论 ...

  7. 对于ChannelNet的一点理解

    主要是为了个人理解,做个笔记 1.Pytorch代码 2.论文出处 3.详细介绍 这篇论文在2018年发出来,而ShuffleNet是从2017年由旷视发出来.起初了解shufflenet的提出,主要 ...

  8. 2022年最新数据库调查报告:超八成DBA月薪过万,你拖后腿了吗?

    数据库管理员属于IT行业高薪职业的一种,近几年关于数据库管理员的薪资统计文章也层出不穷,那么当前,DBA们的薪资究竟到达了怎样的水平呢? 墨天轮数据社区发布最新<2022年墨天轮数据库大调查报告 ...

  9. 墨天轮高分技术文档分享——Oracle升级迁移篇(共96个)

    朋友们好久不见,在上期<墨天轮最受欢迎的技术文档-SQL优化篇>的留言中,有许多朋友表示想看数据库升级迁移相关的内容,经过搜集整理,这就为大家呈上!原文送墨值中,欢迎大家参与~ 数据库升级 ...

  10. Excel读写之xlrd模块

    1.1.xlrd模块介绍 xlrd:用于读取Excle数据文件将返回的数据对象放到内存中,然后查询数据文件对象的相关信息. xlwt:用于在内存中生成新的数据文件对象,处理完成后写入到Excel数据文 ...