【蓝桥杯】RMQ(Range Minimum/Maximum Query)

一.概述

RMQ问题,是求区间最大值或最小值,即范围最值问题。

暴力解法是对每个询问区间循环求解,设区间长度n,询问次数m,则复杂度是O ( nm )。

一般还可以使用线段树求解,复杂度是O(mlogn)。

但还有一种更简便的ST算法,预处理复杂度是O(nlogn),查询O(1)。

二.ST(Sparse Table)算法

它适用于静态空间的RMQ查询。

给定长度为n的静态数列,做m次询问,每次给定L,R \leq n,查询区间[L,R]内的最值。

原理:一个大区间若能被两个小区间覆盖,那么大区间的最值等于两个小区间的最值。(小区间有重合不影响结果)

基本思路:

1)把整个数列划分为很多小区间,并提前计算出每个小区间的最值。

按照倍增分成小区间。

每组小区间的最值,都可以从前一组递推得来。 

2 \times x\geq len设dp[i][j]表示第i处开始的2^j个数字的最值,i是开始位置,j是延伸长度,dp[i][0]是原数组a[i]本身,即边界。

状态转移方程:dp[i][j]=min(dp[i][j-1],dp[i+2^{j-1}][j-1])

这里其实就是把一个区间划分为了两个小区间,通过小区间获得最值。

计算出所有小区间的最值,复杂度为:每一组都需要计算n次,一共有log_2n

时间复杂度为:O(nlogn)

2)对任意一个区间最值查询,找到覆盖它的两个小区间,用两个小区间的最值计算。

以任意元素为起点,有长度为1、2、4、……的小区间,以任意元素为终点,也有长度为1、2、4、……的小区间。

可以将待查询区间[L,R]分为两个小区间,让这两个小区间覆盖[L,R]。一次查询的时间复杂度为:O(1)。

区间长度为len=R-L+1

2 \times x \geq len,小区间的长度为x。

三.实战演练

//ST算法 区间最大值
#include <iostream>
#include <algorithm>using namespace std;const int N=5e5+10;
long long dp[N][20];
int n,q;long long lca(int l,int r){int x=0;while(l+(1<<(x+1))<=r){x++;}return max(dp[l][x],dp[r-(1<<x)+1][x]);
}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>q;//构造dp数组for(int i=1;i<=n;i++){cin>>dp[i][0];}for(int j=1;j<20;j++){for(int i=1;i+(1<<j)-1<=n;i++){dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);}}for(int i=0;i<q;i++){int x,y;cin>>x>>y;cout<<lca(x, y)<<'\n';}return 0;
}

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

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

相关文章

论文解读—— 基于边缘梯度方向插值和 Zernike 矩的亚像素边缘检测

论文&#xff1a;《 Subpixel edge detection based on edge gradient directional interpolation and Zernike moment》 地址&#xff1a; http://www.dpi-proceedings.com/index.php/dtcse/article/view/24488 摘要 在本文中&#xff0c;我们提出了一种基于边缘梯度方向插值…

PowerShell 一键更改远程桌面端口

前言 提高工作效率,安全性和规范化,最终实现一键更改Windows 远程桌面端口 前提条件 开启wmi,配置网卡,参考 一键更改远程桌面端口自动化脚本 默认端口3389变更后的端口3390win+r mstsc YOU_ip常规更改的连接方式win+r mstsc YOU_ip:3390需要恢复到原来的端口3390更改成3…

阿里云2025届春招实习生招聘

投递时间&#xff1a;2024年2月1日-2026年3月1日 岗位职责 负责大型客户“上云”&#xff0c;"用云"技术平台开发。 开发云迁移运维技术工具&#xff0c;帮助阿里云服务团队&&企业客户和服务商自主、高效的完成云迁移。 开发云运维技术工具&#xff0c;帮助…

【java】java环境变量分类

测试代码&#xff1a; public class TestSys {public static void main(String[] args) {/*** 获取所有的系统环境变量*/Map<String, String> map System.getenv();map.forEach((key, value) -> System.out.printf("env&#xff1a;key:%s->value:%s%n"…

leetcode1969--数组元素的最小非零乘积

1. 题意 给定一个非零的二进制位排列&#xff1b; 允许交换其中两个数的二进制位任意次。 求交换后得到数组的最小非零乘积。 如: p 3 a [ 001 010 011 100 101 110 111 ] p3\\ a[001\ 010\ 011\ 100\ 101\ 110\ 111]\\ p3a[001 010 011 100 101 110 111] 将010与101交换…

CPU的Cache和MESI协议

前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第20篇&#xff0c;在这里分享给大家&#xff0c;这篇文章讲CPU的Cache和MESI协议。 为什么需要高速缓存&#xff1f; 通过图片可以清晰的看到&#xff0c;随着时间的发展CPU的性能差距和内存越来越大&#…

Js 原型和原型链

在 JavaScript 中&#xff0c;每个对象都有一个特殊的内部属性&#xff08;[[Prototype]]&#xff09;&#xff0c;它就是对于其他对象的引用。这个其他对象被称为该对象的“原型”。 原型链是由原型对象形成的链状结构。当试图访问一个对象的属性时&#xff0c;如果对象自身没…

使用光标精灵更换电脑鼠标光标样式,一键安装使用

想要让自己在使用电脑时更具个性化&#xff0c;让工作和娱乐更加愉快&#xff0c;改变你的电脑指针光标皮肤可能是一个简单而有效的方法。很多人或许并不清楚如何轻松地调整电脑光标样式&#xff0c;下面我就来分享一种简单的方法。 电脑光标在系统里通常只有几种默认图案&…

SpringBoot项目通过触发器调度实现定时任务

文章目录 前言一、quartz是什么&#xff1f;二、quartz中核心概念三、集成步骤1.引入依赖2.demo样例a.定义一个任务参数实体类b.定义操作触发器、定时任务接口及实现c.作业实现d.结果截图 四、其他1.QuartzJobBean和Job区别2.注意事项3.作业&#xff08;Job&#xff09;和触发器…

飞腾D2000+复旦微 ARM+FPGA+预装麒麟 全国产化COMe模块

产品概述 COMe-D2000核心模块满足PICMG COM Express Type-6 Rev2.1标准规范&#xff0c;遵从COMe BASIC尺寸标准&#xff0c;采用加固设计方案&#xff0c;内存和SSD存储均采用板贴方式&#xff0c;增强了可靠性&#xff0c;体积也得到良好控制。COMe-F662采用国产飞腾腾锐D200…

黑马程序员——javase进阶——day11——字符流,编码表,对象流,其他流

目录&#xff1a; 编码表 思考编码表介绍编码表小结字节流读中文出现码的原码字符输出流 字符流输出介绍FileWriter的成员FileWriter写数据的步骤字符输出流练习字符输入流 字节输入流介绍FileReader的成员字符缓冲流 字符缓冲流字符缓冲流特有的功能字符缓冲流练习转换流 转换…

IO多分复用

#include<myhead.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.65.131" //服务器IPint main(int argc, const char *argv[]) {//1、创建一个套接字int sfd -1;sfd socket(AF_INET, SOCK_STREAM, 0); //参数1&#xff1a;…

MyBatis是纸老虎吗?(四)

在《MyBatis是纸老虎吗&#xff1f;&#xff08;三&#xff09;》这篇文章中我们一起梳理了MyBatis配置文件的解析流程&#xff0c;并详细介绍了其中的一些常见节点的解析步骤。通过梳理&#xff0c;我们弄清楚了MyBatis配置文件中的一些常用配置项与Java Bean之间的对应关系&a…

敏捷项目管理到底有什么价值?一篇说清楚

敏捷方法是一种理念&#xff0c;采用基于人员、协作和共同价值观的组织模型。它作为新兴的项目管理模式&#xff0c;简化了传统项目管理的繁琐流程和文档。敏捷方法采用波浪式规划&#xff08;rolling wave&#xff09;&#xff1b;迭代递增式交付&#xff1b;对变化做出快速而…

交叉注意力融合时域、频域特征的FFT + CNN -BiLSTM-CrossAttention电能质量扰动识别模型

往期精彩内容&#xff1a; 电能质量扰动信号数据介绍与分类-Python实现-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer…

电商数据分析23——利用数据分析优化电商平台的搜索功能

目录 写在开头1. 电商搜索功能的重要性1.1 搜索功能对用户的购物体验的影响1.2 搜索功能对电商平台销售转化率的影响 2. 数据分析在搜索功能优化中的应用2.1 搜索查询日志分析2.2. 用户行为和偏好分析2.3. 搜索结果相关性和排序优化 3. 搜索功能优化的成功案例3.1 案例分享&…

【python开发】并发编程和网络编程的结合+并发和并行概念区别+单例模式通过类来实现

知识补充 一、并发编程&网络编程&#xff08;一&#xff09;多线程socket服务端&#xff08;二&#xff09;多进程&socket服务端 二、并发和并行三、单例模式 一、并发编程&网络编程 网络编程&#xff1a;基于网络基础知识、socket模块实现网络的数据传输&#xf…

AI浸入社交领域,泛娱乐APP如何抓住新风口?

2023年是大模型技术蓬勃发展的一年&#xff0c;自ChatGPT以惊艳姿态亮相以来&#xff0c;同年年底多模态大模型技术在国内及全球范围内的全面爆发&#xff0c;即模型能够理解并生成包括文本、图像、视频、音频等多种类型的内容。例如&#xff0c;基于大模型的文本到图像生成工具…

基于Python的图形用户界面设计及应用

基于Python的图形用户界面设计及应用 摘要&#xff1a;随着信息技术的飞速发展&#xff0c;图形用户界面&#xff08;GUI&#xff09;已成为现代软件不可或缺的一部分。Python作为一种简洁、易读且功能强大的编程语言&#xff0c;提供了多种GUI开发工具包&#xff0c;如Tkinte…

读锁和写锁(共享锁和排他锁)介绍 以及相关类 ReentrantReadWriteLock 学习总结,使用场景

一、读锁和写锁概念 读锁&#xff1a; 也称共享锁&#xff0c;多个线程可以共享资源&#xff0c;同时读取数据和资源&#xff0c;但是不允许出现写操作。多个线程可以同时持有读锁&#xff0c;提高并发性能&#xff0c;因为不会对数据修改。 写锁&#xff1a; 也称排他锁&…