如何正确使用 RMQ

news/2024/11/28 20:57:25/文章来源:https://www.cnblogs.com/Link-Cut-Y/p/18575149

序列分块。设块长为 \(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)}\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843069.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Paypal最新版本 paypal-server-sdk 使用案例(前端 Vue3 + 后端Spring Boot )

背景 在项目中对接Paypal支付,一开始在网上查了好久,发现资料少,而且陈旧,甚至我都没弄清楚我应该哪个SDK。 我到 maven 中央仓库中,搜索 com.paypal.sdk,能查出不少结果,据我所知,至少有三个sdk可以从后端访问到Paypal:paypal-core:非常陈旧,2016年就停止更新了,但…

【java编程】URLClassLoader

从上面我们研究【java编程】双亲委派模式时进行Debug了源代码, 可以发现的是, URLClassLoader是ExtClassLoader && AppClassLoader的父类(不是父亲), public class Launcher {static class ExtClassLoader extends URLClassLoader {}static class AppClassLoader exten…

秒杀系统

前言 秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大…

.NET周刊【11月第4期 2024-11-24】

国内文章 C# 入门深度学习:万字长文讲解微积分和梯度下降 https://www.cnblogs.com/whuanle/p/18551532 这篇文章主要介绍了使用 C# 进行深度学习的方法,特别是微积分在此领域的应用。作者简要讲解了极限、导数等基本概念,并展示了如何在 C# 中实现这些数学运算,例如将一个…

高级程序语言第九次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C 这个作业要求在哪里:https://edu.cnblogs.com/campus/fzu/2024C/homework/13311 学号:102400204 姓名:刘嘉奕不太理解10题a,b两个题目的要求有何不同,一个把值返回该结构,不运用指针,而b要把值赋给合适…

DataSophon集成StreamPark2.1.5

为DataSophon制作streampark-2.1.5安装包.md 下载并解压streampark 2.1.5安装包 StreamPark官网下载 wget -O /opt/datasophon/DDP/packages/apache-streampark_2.12-2.1.5-incubating-bin.tar.gz https://www.apache.org/dyn/closer.lua/incubator/streampark/2.1.5/apache-s…

以Deformable_DETR为例说明训练过程

以Deformable_DETR为例说明使用服务器训练过程 下载程序文件 根据论文提供的github地址fundamentalvision/Deformable-DETR: Deformable DETR: Deformable Transformers for End-to-End Object Detection.下载zip到本地 租用服务器 在autodl平台租用服务器,申请账号氪金之后去…

Qt VTK加载openfoam计算结果

Qt VTK加载openfoam计算结果.foam文件。#include <QApplication> #include <QDebug> #include "qvtkopenglwidget.h" #include <vtkSmartPointer.h> #include <vtkGenericDataObjectReader.h> #include <vtkPolyDataMapper.h> #includ…

蓝桥3511飞机降落

样例输入 2 3 0 100 10 10 10 10 0 2 20 3 0 10 20 10 10 20 20 10 20 样例输出 YES NO思路: 具体来说,对于每架飞机,有起飞时间(t)、降落时间限制(d)和飞行时长(l)等信息,代码要判断能否按照一定规则安排这些飞机的起降顺序,使得所有飞机都能在其降落时间限制内完成…

多校A层冲刺NOIP2024模拟赛27终结篇

不知道是不是我打的最后一场模拟赛了,记录一下吧,总体来说还不错,虽然 \(T1\) 方案数求错爆零了,但 \(T3\) 场切了,暴力打满的话有265,希望 \(NOIP\) 时也可以不让自己遗憾吧。 A 【模板】分治FFT 考虑每加进来一个数的贡献 \(x_1*x_2+(x_1+x_2)*x_3+...=x_1*x_2+x_1*x_3…

elasticseach-head插件

git地址 https://github.com/mobz/elasticsearch-head 安装方式 浏览器插件 docker本地安装