【海贼王的数据航海】ST表——RMQ问题

目录

1 -> RMQ问题

1.1 -> 定义

1.2 -> 解决策略

2 -> ST表

2.1 -> 定义

2.2 什么是可重复贡献问题

2.3 -> 预处理ST表

2.4 -> 处理查询

2.5 -> 实际问题


1 -> RMQ问题

1.1 -> 定义

RMQ (Range Minimum/Maximum Query)即区间最值查询问题指:有一组数据和若干个查询,要求在短时间内回答每个查询[ l ,r ] 内的最值。

1.2 -> 解决策略

  1. 朴素搜索:暴力(BFS/DFS) 时间复杂度O(n)。
  2. 线段树(Segment Tree) 时间复杂度O(n)-O(logn)。
  3. ST表(Sparse Table,稀疏表):倍增思想,O(nlogn)预处理,O(1)查询最值。

2 -> ST表

2.1 -> 定义

ST表(Sparse Table,稀疏表),主要应用倍增思想,是一种用于解决可重复贡献问题数据结构。它通过预处理给定数组,创建一个二维表格,使得任何区间的最小/最大值查询都可以在常数时间内完成。ST表特别适合于静态数据:当数列不经常改变时,它是最有效的。可以实现O(nlogn)预处理、O(1)查询。主要用于解决RMQ问题

2.2 什么是可重复贡献问题

可重复贡献问题是指在某些特定的数学运算中,当运算的性质满足一定条件时,即使是在包含重复部分的区间内进行询问,所得到的结果仍然是相同的问题。这种问题的特点是,它们可以通过预处理所有可能的区间,然后在查询时直接返回预处理的结果来解决。例如,最大值问题和最大公因数问题就是典型的可重复贡献问题,因为它们满足以下性质:

  • 最大值满足 max(x, x) = x
  • 最大公因数满足 gcd(x, x) = x

这些性质意味着,对于任何给定的数 x,其自身与其他任何数的最大值或最大公因数仍然是 x 本身。因此,当我们需要计算一个区间内的最大值或最大公因数时,可以将区间分割成更小的子区间,并利用这些子区间的结果来快速得出整个区间的答案。 

2.3 -> 预处理ST表

倍增法递推:用两个等长的小区间拼凑成一个大区间。

f[ i ][ j ] 以第 i 个数为起点,长度为2^{^{j}}的区间中的最大值。

理想状态方程:f[ i ][ j ] = max(f[ i ][ j - 1 ], f[ i + 2^{j - 1}][j - 1])

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
using namespace std;const int N = 1e5 + 10;const int M = 20;int f[N][M];int main()
{//预处理ST表int n = 0;int m = 0;for (int i = 0; i < n; i++)cin >> f[i][0];for (int j = 1; j <= M; j++)  //枚举区间长度for (int i = 1; i + (1 << j) - 1 <= n; i++)  //枚举起点f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);return 0;
}

区间终点:i+ 2^{j}-1\leq n

假如n = 6

区间长度倍增:1,2,4,8……

f[ i,0 ]:[ 1 1 ][ 2 2 ][ 3 3 ][ 4 4 ][ 5 5 ][ 6 6 ]

f[ i,1 ]:[ 1 2 ][ 2 3 ][ 3 4 ][ 4 5 ][ 5 6 ]

f[ i,2 ]:[ 1 4 ][ 2 5 ][ 3 6 ]

j=3:i+2^{j}-1=1+8-1>6

2.4 -> 处理查询

对查询区间[ l,r ]做分割、拼凑。

区间长度的指数:k=log_{2}(r - l + 1)

k = 0:{1}

k = 1:{2,3}

k = 2:{4,5,6,7}

k = 3:{8,9,10,11,12,13,14,15}

通过观察可以发现:2^{k}\leq r-l+1< 2\cdot 2^{k}

即区间[ l,r ]必可以用两个长度为2^{k}的区间重叠拼凑

max(f[l][k],f[r-2^{k}+1][k]) 

    int l = 0;int r = 0;for (int i = 1; i <= m; i++){scanf("%d %d", &l, &r);int k = log2(r - l + 1);  //区间长度指数printf("%d\n", max(f[l][k], f[r - (1 << k) + 1][k]));}

[1,4] -> [1,4] + [1,4] 

[1,5] -> [1,4] + [2,5] 

[1,6] -> [1,4] + [3,6] 

[1,7] -> [1,4] + [4,7] 

总结:凡是符合结合律且可重复贡献的信息查询都可以使用ST表。显然最大值、最小值、最大公因数、最小公倍数、按位或、按位与都符合这个条件。如果涉及区间修改操作,就要使用线段树解决了。 

2.5 -> 实际问题

luogu:P3865

题目链接:P3865 【模板】ST 表

题目背景

这是一道 ST 表经典题——静态区间最大值

题目描述

给定一个长度为 N 的数列,和 M 次询问,求出每一次询问的区间内数字的最大值。

输入格式

第一行包含两个整数 N,M,分别表示数列的长度和询问的个数。

第二行包含 N 个整数(记为 ai​),依次表示数列的第 i 项。

接下来 M 行,每行包含两个整数 𝑙𝑖,𝑟𝑖,表示查询的区间为 [𝑙𝑖,𝑟𝑖]。

输出格式

输出包含 M 行,每行一个整数,依次表示每一次询问的结果。

输入输出样例

输入 #1

8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8

输出 #1

9
9
7
7
9
8
7
9

说明/提示

对于 30%30% 的数据,满足 1≤𝑁,𝑀≤101≤N,M≤10。

对于 70%70% 的数据,满足 1≤𝑁,𝑀≤1051≤N,M≤105。

对于 100%100% 的数据,满足 1≤𝑁≤1051≤N≤105,1≤𝑀≤2×1061≤M≤2×106,𝑎𝑖∈[0,109]ai​∈[0,109],1≤𝑙𝑖≤𝑟𝑖≤𝑁1≤li​≤ri​≤N。

AC代码:

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
#include <cmath>
using namespace std;const int N = 1e5 + 10;const int M = 20;int f[N][M];int main()
{//预处理ST表int n = 0;int m = 0;scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++)scanf("%d", &f[i][0]);for (int j = 1; j <= M; j++)  //枚举区间长度for (int i = 1; i + (1 << j) - 1 <= n; i++)  //枚举起点f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);int l = 0;int r = 0;for (int i = 1; i <= m; i++){scanf("%d %d", &l, &r);int k = log2(r - l + 1);  //区间长度指数printf("%d\n", max(f[l][k], f[r - (1 << k) + 1][k]));}return 0;
}

感谢各位大佬支持!!!

互三啦!!!

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

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

相关文章

黑马点评DAY2|Redis基本操作

Redis客户端 命令行客户端 进入到redis的安装目录&#xff0c;可以看到redis-cli文件&#xff0c;这就是redis的命令行客户端&#xff0c;在安装redis时自带的。 使用方式如下 redis-cli [options] [commonds]其中常见的options有&#xff1a; -h 127.0.0.1 &#xff1a;指…

电量监测与电量计基础知识

硬件之路学习笔记 ​-----前文导读----- ①、公众号主页点击发消息 ②、点击下方菜单获取系列文章 -----本文简介----- 主要内容包括&#xff1a; ①&#xff1a;简介 ②&#xff1a;省成本方式-电阻分压 ③&#xff1a;精确方式-电量计与阻抗跟踪技术 ----- 正文 ----…

JavaWeb--jquery篇

概述 jQuery是一个快速、简洁的JavaScript框架&#xff0c;是一个优秀的JavaScript代码库&#xff08;框架&#xff09;于2006年1月由John Resig发布。它封装JavaScript常用的功能代码&#xff0c;提供一种简便的JavaScript设计模式&#xff0c;优化HTML文档操作、事件处理、动…

2229:Sumsets

网址如下&#xff1a; OpenJudge - 2229:Sumsets 这题不是我想出来的 在这里仅做记录 代码如下&#xff1a; #include<iostream> using namespace std;const int N 1000000000; int dp[1000010]; int n;int main() {cin >> n;dp[0] 1;dp[1] 1;for (int i 2…

前端面试题7(单点登录)

如何实现单点登录 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种允许用户在多个应用系统中只需登录一次&#xff0c;就可以访问所有相互信任的应用系统的认证技术。实现前端单点登录主要依赖于后端的支持和一些特定的协议&#xff0c;如OAuth、Ope…

无法下载cuda

cuda下载不了 一、台式机电脑浏览器打不开cuda下载下面二、解决办法 一、台式机电脑浏览器打不开cuda下载下面 用360、chrome、Edge浏览器都打不开下载页面&#xff0c;有的人说后缀com改成cn&#xff0c;都不行。知乎上说是网络问题&#xff0c;电信换成换成移动/联通的网络会…

Selenium 切换 frame/iframe

环境&#xff1a; Python 3.8 selenium3.141.0 urllib31.26.19说明&#xff1a; driver.switch_to.frame() # 将当前定位的主体切换为frame/iframe表单的内嵌页面中 driver.switch_to.default_content() # 跳回最外层的页面# 判断元素是否在 frame/ifame 中 # 126 邮箱为例 # …

无人机云台类型及作用

无人机云台主要分为三种类型&#xff1a; 单轴云台&#xff1a;仅支持单向旋转&#xff0c;适合拍摄平滑的延时摄影和全景照片。 双轴云台&#xff1a;支持水平和垂直旋转&#xff0c;可用于拍摄流畅的视频和运动物体。 三轴云台&#xff1a;全面支持所有旋转轴&#xff0c;…

医院陪诊系统开发的关键技术与挑战

随着医疗服务需求的不断提升&#xff0c;传统的医院服务模式面临着巨大的压力和挑战。为了提升患者的就医体验和医疗服务的效率&#xff0c;医院陪诊系统应运而生。本文将探讨医院陪诊系统开发的关键技术与挑战&#xff0c;并结合具体的技术代码进行分析。 一、医院陪诊系统的…

悠律凝声环开放式耳机强者现身:集颜值和创新技术于一体的杰作

随着技术的飞速发展&#xff0c;蓝牙耳机已经成为人们生活中不可缺少的一环&#xff0c;外观、音质以及实用性已经成为人们在购买时最主要的考虑因素。悠律凝声环RingBuds Pro开放式蓝牙耳机&#xff0c;凭借其特有的轻奢时尚外观&#xff0c;斩获2024年度MUSE缪斯创意奖金奖&a…

Kotlin协程使用详解

协程是什么 协程是一种编程思想,并不局限于特定的语言。协程是轻量级的线程,基于线程池API,通俗的来说,就是官方提供的线程框架。协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。当我们在了解协程的时候,不可避免的会跟线程、进程作比较作分析,下面来贴个图…

数据可视化之智慧城市的脉动与洞察

在数字化转型的浪潮中,城市作为社会经济发展的核心单元,正经历着前所未有的变革。城市数据可视化大屏看板作为这一变革中的重要工具,不仅极大地提升了城市管理效率,还为公众提供了直观、全面的城市运行状态视图,成为智慧城市建设不可或缺的一部分。本文将深入探讨以“城市…

网安小贴士(9)网络解密

一、前言 网络解密技术的发展是一个不断进化的过程&#xff0c;它与加密技术的进展紧密相连。 二、定义 网络解密&#xff08;Network Decryption&#xff09;通常指的是在计算机网络环境中&#xff0c;将加密的数据转换回其原始可读格式的过程。这个过程需要使用正确的密钥…

ctfshow-web入门-文件包含(web88、web116、web117)

目录 1、web88 2、web116 3、web117 1、web88 没有过滤冒号 : &#xff0c;可以使用 data 协议&#xff0c;但是过滤了括号和等号&#xff0c;因此需要编码绕过一下。 这里有点问题&#xff0c;我 (ls) 后加上分号发现不行&#xff0c;可能是编码结果有加号&#xff0c;题目…

【反悔堆 优先队列 临项交换 决策包容性】630. 课程表 III

本文涉及知识点 贪心 反悔堆 优先队列 临项交换 Leetcode630. 课程表 III 这里有 n 门不同的在线课程&#xff0c;按从 1 到 n 编号。给你一个数组 courses &#xff0c;其中 courses[i] [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课&#xff0c;并且必…

WordPress网站违法关键词字过滤插件下载text-filter

插件下载地址&#xff1a;https://www.wpadmin.cn/2025.html 插件介绍 WordPress网站违法关键词字过滤插件text-filter由本站原创开发,支持中英文关键字自动替换成**号&#xff0c;可以通过自定义保存修改按钮增加“预设关键字”&#xff0c;也可以导入定义好的txt文本形式的关…

实现模型贴图的移动缩放旋转

技术&#xff1a;threejscanvasfabric 效果图&#xff1a; 原理&#xff1a;threejs中没有局部贴图的效果&#xff0c;只能通过map 的方式贴到模型上&#xff0c;所以说换一种方式来实现&#xff0c;通过canvasfabric来实现图片的移动缩放旋转&#xff0c;然后将整个画布以map…

数据集 | 人脸公开数据集的介绍及下载地址

本文介绍了人脸相关算法的数据集。 1.人脸数据集详情 1.1.Labeled Faces in the Wild (LFW) 论文 下载地址&#xff1a;LFW Face Database : Main (umass.edu) 是目前人脸识别的常用测试集&#xff0c;其中提供的人脸图片均来源于生活中的自然场景&#xff0c;因此识别难度会…

DDR的拓扑与仿真

T型拓扑 vs Fly-by 由于T型拓扑在地址、命令和时钟都是同时到达每个DDR芯片&#xff0c;所以同步的切换噪声会叠加在一起&#xff0c;DDR越多这个信号上叠加的噪声越大&#xff0c;T型拓扑的优点是地址、命令和时钟都是同时到达&#xff0c;所以不需要做写均衡Write leveling。…

Node.js 生成vue组件

在项目根目录下创建 create.js /*** 脚本生成vue组件* 主要是利用node自带的fs模块操作文件的写入* ===========================================* 准备步骤:* 1.输入作者名* 2.输入文件名* 3.输入菜单名* 4.输入文件地址* ============================================* 操…