首页 > 其他分享 >【倍增】RMQ问题与ST表

【倍增】RMQ问题与ST表

时间:2024-10-12 22:45:53浏览次数:1  
标签:lg RMQ ll st ST 区间 倍增

问题叙述

RMQ 是 Range Maximum/Minimum Query 的缩写,表示区间最大/最小值。

显而易见的,可以用线段树写。但是我这样的蒟蒻早就忘了线段树怎么写了,而且由于该问题不涉及修改操作,所以线段树十分没有性价比。
这是就需要用到好理解又好写的ST表了。

算法思路

ST表是用于解决可重复贡献问题的数据结构。

倍增思想:我们考虑将 \(st_{i,j}\) 定义为 起点为 \(i\), 到 \(i + 2^j - 1\) 位置的所有元素的最大值。例如 \(st_{i,1}\) 表示 \(i\) 和 \(i + 1\) 中的最大值。

该如何处理转移过程?

把当前区间拆成两个大小相等的区间,用动态规划求出答案。
st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
这样就可以保证该区间内所有的元素都被转移了。预处理就是将 \(st_{i,0}\) 表示第 \(i\) 个元素的最大值,即本身。

查询过程?

查询过程也一样,分成两个区间,这里我用的是 st[i][k]st[r - (1 << k) + 1][k],因为这样刚好有一部分重叠,可以保证答案转移的正确性,然后分别求最大值最后在汇总一下。 return max(st[l][k], st[r - (1 << k) + 1][k]);其中的k = log[r - l + 1],用于分隔两个区间。至于怎么求 $\log$,这里我用的是传统求 lg[i] + 1` 的写法,见下方代码。

总代码

例题:洛谷 P3865【模板】ST 表 && RMQ 问题

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
const ll MAXN = 1e5 + 5;
ll st[MAXN][25], lg[MAXN];

ll Query(ll l, ll r){
	ll k = lg[r - l + 1] - 1;
	return max(st[l][k], st[r - (1 << k) + 1][k]);
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0); 
	ll n, m;
	cin >> n >> m;
	for(ll i = 1; i <= n; i ++){
		cin >> st[i][0];
	}
	for(ll i = 1; i <= n; i ++){
		lg[i] = lg[i - 1] + ((1 << lg[i - 1]) == i);
	}
	for(ll j = 1; j <= 20; j ++){
		for(ll i = 1; i + (1 << j) - 1 <= n; i ++){
			st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
		}
	}
	while(m --){
		ll l, r;
		cin >> l >> r;
		cout << Query(l, r) << "\n";
	}
	return 0;
}

标签:lg,RMQ,ll,st,ST,区间,倍增
From: https://www.cnblogs.com/Allen-yang2010/p/18461615

相关文章

  • windows下基于cmake配置opencv并使用visual studio编译
     在Windows上下载并编译OpenCV,然后配置系统环境变量的步骤如下:1.下载OpenCV打开OpenCV官方下载页面。找到最新的Windows版本,点击下载,例如:opencv-4.x.x-vc14_vc15.exe,这将是一个自解压文件。下载完成后,双击opencv-4.x.x-vc14_vc15.exe文件,选择一个目录将其解压,......
  • Python用CNN - LSTM、ARIMA、Prophet股票价格预测的研究与分析|附数据代码
    全文链接: https://tecdat.cn/?p=37860原文出处:拓端数据部落公众号 分析师:SabrinaHuang股票市场的波动起伏一直备受投资者关注,准确预测股票价格对于投资者制定合理的投资策略至关重要。股票价格数据具有时间序列特性,近年来,随着机器学习和深度学习技术的发展,各种模型被应用于......
  • PyTorchStepByStep - Chapter 2: Rethinking the Training Loop
      defmake_train_step_fn(model,loss_fn,optimizer):defperform_train_step_fn(x,y):#SetmodeltoTRAINmodemodel.train()#Step1-Computemodel'spredictions-forwardpassyhat=model(x)......
  • Leetcode 贪心算法之 Container With Most Water
    题目描述给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例:输入:[1,8,6,2,5,4,8,3,7]输......
  • 【Azure Cloud Service】使用RESTAPI更新Cloud Service(Extended Support) 中所配置的
    问题描述当根据CloudService(ExtendedSupport)文档更新证书(https://docs.azure.cn/zh-cn/cloud-services-extended-support/certificates-and-key-vault)时,如果遇见旧的证书(如中间证书,根证书)信息保存在KeyVaultSecret中,而更新的时候,只能从KeyVault证书中匹配到服务......
  • STM32与ESP32串口数据发送以及网页端数据实时显示和远程遥控
    目标:实现网页端速度实时显示以及可以通过点击页面按键达到对小车的位移方位控制。一、ESP32代码首先,需要让ESP32连接到WiFi,这样才能为后续的操作做准备。ssid="xxxxxx"password="xxxxxx"#WIFI连接defwifi_connect():wlan=network.WLAN(network.STA_IF)#STA模式......
  • strlen计算字符串长度
    stringlengthstrlen是C语言标准库中的一个函数,用于计算字符串的长度,不包括终止符\0。在VisualC++(VC)中,你可以直接使用这个函数。只需要包含头文件<cstring>(在C++中)或<string.h>(在C中),然后就可以调用strlen函数了。例如,在C++中使用strlen的代码如下:#include<iost......
  • Git Large File Storage
    GitLargeFileStoragekeywords:git大文件官网:https://git-lfs.com/github地址:https://github.com/git-lfs/git-lfsGitLFSisacommandlineextensionandspecificationformanaginglargefileswithGit.TheclientiswritteninGo,withpre-compiledbinar......
  • KEYENCE Programming Contest 2024(AtCoder Beginner Contest 374)E题
    六年级蒟蒻来题解了!!!题目大意:给定你一个n,表示有n个生产线,每一个生产线都有两种机器,第i个生产线第一件产品每天可以造Ai件零件但是得付出Pi元的代价,第二件产品每天可以生产Bi件物品但是得付出Qi元的代价,然后给你x元的预算问你所有流水线中的最小值的最大值是多少?思路:首先我们......
  • Elasticsearch 基础入门
    查询集群文档数量查询集群文档数量curl-XGET-k-uelastic:passwd-H'Content-Type:application/json''https://localhost:9200/_count?pretty'curl-i显示响应头信息curl-XGET-i-k-uelastic:passwd-H'Content-Type:application/json''https:......