AcWing 1273. 天才的记忆—RMQ

news2024/11/24 20:43:40

题目链接: AcWing 1273. 天才的记忆
问题描述
在这里插入图片描述
RMQ是用来求解静态区间最大/小值的算法,静态空间就是数组里的数不会变,动态空间最大/小值可以用线段树或者树状数组来求解。

RMQ算法有点类似与区间DPRMQ算法的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),预处理的时间为 O ( n l o g n ) O(nlogn) O(nlogn),查询的时间为 O ( 1 ) O(1) O(1),下面讲解一下这个算法步骤,做过区间DP问题应该很容易明白。

用数组f[i][j]来表示以i为开头,长度为 2 j 2^j 2j区间内的最大值,举个例子:

序列A: 1 2 3 4 5 (下标从1开始)
f[1][0]=A[1]=1,								0表示2^0
f[1][1]=max(A[1],A[2])=1,					1表示2^1
f[1][2]=max(A[1],A[2],A[3],A[4])=4,			2表示2^2

那么状态表示就清楚了,状态怎么转移的呢?

f[i][j]=max(f[i][j-1],f[i-(1<<j)][j-1]
也就是2^j长的区间刚好可以分成两个长度为2^{j-1}的小区间,长区间的最大值就等于两个小区间中最大值的最大值

这里的思路和区间DP很像
那么如果给定一个区间[l,r],我们如何根据上面得到的数组f来求这个区间的最大值呢,因为这个区间长度也不一定是 2 k 2^k 2k呀?

这里的区间长度len=r-l+1
我们可以将这个区间分成两小,第一个小区间是从l开始,长度为 2 k 2^k 2k,第二个区间是从r结束,长度为 2 k 2^k 2k k = l o g 2 ( l e n ) 下取整 k=log_2(len)下取整 k=log2(len)下取整
举个例子,比如区间[1,5]长度为5,那么k=2小区间的长度为4,第一个小区间是为[1,4],第二个小区间为[3,5],这两个小区间刚好完全覆盖大区间[1,5],所以在这两个小区间中取一个max,就得到了大区间的max,这样就能在 O ( n l o g n ) O(nlogn) O(nlogn)的预处理下,用 O ( 1 ) O(1) O(1)的时间复杂度查询。
代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int N=2e5+10,M=20;

int h[N];
int f[N][M];//f[i][j]表示考虑以i为开头,长度为2^j的区间最大值
int n,m;
void st(){
    for(int i=0;i<M;i++)
        for(int j=1;j+(1<<i)-1<=n;j++)
            if(!i) f[j][i]=h[j];
            else f[j][i]=max(f[j][i-1],f[j+(1<<i-1)][i-1]);
}
int query(int l,int r){
    int len=r-l+1;
    int k=log(len)/log(2);
    return max(f[l][k],f[r-(1<<k)+1][k]);
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",&h[i]);
    st();
    cin>>m;
    while(m--){
        int l,r;
        scanf("%d%d",&l,&r);
        printf("%d\n",query(l,r));
    }
    return 0;
}


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

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

相关文章

三菱 FX三菱PLC以太网通信程序

捷米特三菱FX转以太网通讯处理器是一款经济型的以太网通讯处理器&#xff0c;是为满足日益增多的工厂设备信息化需求&#xff08;设备网络监控和生产管理&#xff09;而设计&#xff0c;用于三菱FX1S/1N/2N/3S/3G/3GA/3GC/3U/3UC系列、汇川、士林AX、禾川、维控等PLC以太网数据…

【算法和数据结构】347、LeetCode前 K 个高频元素

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;首先我们使用一个哈希表记录每个元素出现的频率。再设置一个优先队列&#xff0c;并将数组中元素出现的…

C语言实现扫雷【经典】

前言   本篇文章要实现的是扫雷游戏&#xff0c;其代码实现与上一篇的三子棋游戏类同&#xff0c;都是在棋盘的基础上&#xff0c;与电脑进行对抗&#xff0c;不同的是&#xff0c;扫雷游戏一开始电脑就已经随机布置好了所有“雷”。 请戳 --->三子棋 扫雷游戏 1. 扫雷游…

【Visual Studio】VTK 显示小球例子,在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 关于更多此例子的资料&#xff0c;可以参考&#xff1a;【Visual Studio】在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK。 文章目录 版本环境VTKTest.…

Nginx upstream 负载均衡配置

[toc] ## 问题: 自7/4 以来, 所有设备同时出现 Network Error, 导致业务无法正常进行, 频率 3次/每分钟; ## 现场情况及原因分析: 3楼: 8条产线 4楼: 20条产线 5楼: 5条产线 点数: 33条线 * 平均 (5台工位 1台电视看板 3台测试仪 ) ≈ 300 - Nginx 日志占用: access 日志 …

【MySQL备份与还原、索引、视图】练习

一、备份与还原 /***************************样例表***************************/CREATE DATABASE booksDB;use booksDB;CREATE TABLE books(bk_id INT NOT NULL PRIMARY KEY,bk_title VARCHAR(50) NOT NULL,copyright YEAR NOT NULL);INSERT INTO booksVALUES (11078, Lear…

UNIX网络编程卷一 学习笔记 第二十三章 高级SCTP套接字编程

SCTP是一个面向消息的协议&#xff0c;递送给用户的是部分的或完整的消息。只有当发送大消息时&#xff0c;在对端才会递送部分的消息。部分消息被递送给应用后&#xff0c;多个部分消息组合成单个完整消息不由SCTP负责。在SCTP应用进程看来&#xff0c;一个消息既可由单个输入…

线性代数的一些小细节

1 .矩阵的满足结合律&#xff0c;但不满足交换律 验证和证明如下图&#xff1a; 如下&#xff0c;UWQ三个矩阵的2种结合&#xff0c;证明矩阵乘法满足结合律 下图中&#xff0c;AB 和BA的值可能是不同的&#xff08;相同的条件是图中相互对应的4项相同&#xff0c;即对称矩阵…

防范 XSS 攻击的措施

防范 XSS 攻击的措施 XSS&#xff08;Cross-site scripting&#xff09;攻击是一种常见的网络安全漏洞&#xff0c;它可以通过注入恶意代码来攻击用户的计算机和浏览器&#xff0c;从而窃取用户的敏感信息或执行恶意操作。本篇文章将介绍防范 XSS 攻击的措施&#xff0c;并提供…

Spring设计模式及部分技术讲解

讲师:邓澎波 Spring面试专题 1.Spring应该很熟悉吧?来介绍下你的Spring的理解 有些同学可能会抢答,不熟悉!!! 好了,不开玩笑,面对这个问题我们应该怎么来回答呢?我们给大家梳理这个几个维度来回答 1.1 Spring的发展历程 先介绍Spring是怎么来的,发展中有哪些核心的节…

Linux文件

目录 系统级I/O 简介 接口 文件描述符fd 重定向 缓冲区 文件系统 软硬链接 动静态库 静态函数库 动态库 系统级I/O 简介 输入/输出&#xff08;I/O&#xff09;是在主存和外部设备&#xff08;磁盘驱动器、终端和网络&#xff09;之间复制数据的过程。输入操作是…

opencv-04 像素处理

opencv-04 像素处理 在 OpenCV 中&#xff0c;最小的数据类型是无符号的 8 位数。因此&#xff0c;在 OpenCV 中&#xff0c;实际上并没有二值图像这种数据类型&#xff0c;二值图像经常是通过处理得到的&#xff0c;然后使用0表示黑色&#xff0c;使用 255 表示白色。 可以将…

【基本算法】三分法模板

洛谷三分法https://www.luogu.com.cn/problem/P3382 题目描述 如题&#xff0c;给出一个 N 次函数&#xff0c;保证在范围 [l,r] 内存在一点 x&#xff0c;使得 [l,x] 上单调增&#xff0c;[x,r] 上单调减。试求出 x 的值。 输入格式 第一行一次包含一个正整数 N 和两个实数…

吐血整理,Jmeter分布式性能压测-常见问题+解决(详细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 安装常见问题 问题…

使用npm和nrm查看源和切换镜像

一、使用npm查看当前源、切换淘宝镜像、切换官方源 &#xff08;1&#xff09;npm查看当前源&#xff1a; npm get registry &#xff08;2&#xff09;npm设置淘宝镜像源&#xff1a; npm config set registry http://registry.npm.taobao.org &#xff08;3&#xff09;n…

注册中心技术Eureka、Nacos

说明&#xff1a;在微服务框架中&#xff0c;各个服务之间都是独立的。理论上来说&#xff0c;各个服务之间是可以直接通信的&#xff0c;但实际上因为服务之间通信需要管理和规划&#xff0c;如请求怎么负载均衡、请求怎么降级处理等等&#xff0c;所以就需要使用一个技术&…

企业绿色发展关键环节:产品碳足迹管理

近年来&#xff0c;产品生产消费对环境造成的影响越来越受到重视。“产品碳足迹”作为衡量产品对环境影响的重要指标&#xff0c;已成为企业在产品生命周期管理中不可忽视的元素。“产品碳足迹”&#xff08;Product Carbon Footprint, PCF&#xff09;是指产品在生产、制造、运…

【剧前爆米花--前端三剑客】JavaScript(WebAPI)中的相关方法和实例

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaEE初阶》 文章分布&#xff1a;这是一篇关于JavaScript&#xff08;WebAPI&#xff09;的文章&#xff0c;在这篇文章中我会简单介绍一些常用的js方法&#xff0c;并给出他们的应用实例&#xff0c;希望对你有所帮助&#xf…

代码随想录day2 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

文章目录 一、977.有序数组的平方二、209.长度最小的子数组三、59.螺旋矩阵II 一、977.有序数组的平方 977.有序数组的平方 暴力法&#xff1a;O(NlogN) 先所有数字平方&#xff0c;然后再快排&#xff0c;时间复杂度取决于快排 class Solution { public:vector<int> s…

Openlayers实战:加载天地图

国家地理信息公共服务平台“天地图”(以下简称“天地图“)是国家基础地理信息中心建设的网络化地理信息共享与服务门户。 其属于国家队的,有一定的权威性。 在Openlayers中如何加载天地图呢,方法很简单,用XYZ的形式。 它分为底图和标注,可以灵活的做配合使用。 效果图 源…