首页 > 编程语言 >RMQ问题中的ST算法

RMQ问题中的ST算法

时间:2023-08-07 22:14:38浏览次数:26  
标签:ch int 最大值 ST 算法 RMQ

RMQ问题中的ST算法

长为 n 的数组 a ,m次询问,求l~r中最大值是多少

// RMQ问题中的ST算法
// m次询问,求l~r中最大值是多少
#include<bits/stdc++.h>
#define reg register
using namespace std;

// 读取输入的函数
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

// 输出结果的函数
inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9) write(x/10);
	putchar(x%10+'0');
	return ;
}

const int MAXN=100005;
vector<int > a; // 存储输入数据的数组
int n,f[MAXN][21],m; // f[i][j]表示区间[i, j]的最大值

// ST预处理函数
void ST_prework(){
	for(reg int i=1;i<=n;i++) f[i][0]=a[i]; // 将第一个元素作为区间的最大值
	int t=log(n)/log(2)+1; // 确定二维数组f的维度
	for(reg int j=1;j<t;j++){ // 从第二个维度开始遍历二维数组f
		for(reg int i=1;i<=n-(1<<j)+1;i++){ // 从第一个维度开始遍历一维数组f的第一部分
			f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]); // 根据状态转移方程更新f[i][j]的值
		}
	}
	return ;
}

// ST查询函数,返回区间[l, r]的最大值
int ST_query(int l, int r){
	int g=log(r-l+1)/log(2); // 计算区间长度的对数,向上取整得到二进制位数g
	return max(f[l][g],f[r-(1<<g)+1][g]); // 根据状态转移方程和边界条件返回区间最大值
}

// 主函数,读取输入数据,调用ST预处理函数和查询函数,输出结果
int main(){
	n=read(),m=read(); // 读取输入数据的数量n和查询次数m
	a.push_back(0); // 在a数组末尾添加一个元素,用于记录空元素的位置,方便后续处理边界情况
	for(reg int i=1;i<=n;i++)a.push_back(read()); // 按照顺序读取输入数据并存储到a数组中
	ST_prework(); // 对输入数据进行预处理,构建ST表f
	for(reg int i=1;i<=m;i++){ // 对于每次查询,调用ST查询函数并输出结果
		int p=read(),q=read(); // 读取查询的起始位置p和结束位置q
		write(ST_query(p, q)); // 将查询结果写入输出流中,并换行分隔每个查询结果
		putchar('\n'); // 在每次查询后换行,使得输出更加清晰易读
	}
	return 0;
}

标签:ch,int,最大值,ST,算法,RMQ
From: https://www.cnblogs.com/Nebulary/p/17612852.html

相关文章

  • 单调栈算法
    单调栈算法单调栈,就是一个栈,不过栈内元素保证单调性。即,栈内元素要么从小到大,要么从大到小。//单调栈算法#include<bits/stdc++.h>#defineregregisterusingnamespacestd;//读取输入,并返回一个整数inlineintread(){ intx=0,f=1; charch=getchar(); while(ch<'......
  • ArrayList底层原理、线程安全及其相关集合(面试常问)
    一、ArrayList底层原理1.特点及其原理:ArrayList底层基于数组实现,查找快,增删慢2.ArrayList底层原理,初始化及调用add()方法添加元素:默认初始化容量为10第一次创建集合并在添加第一个元素时在底层创建一个默认长度为10的数组:​调用构造函数初始化时默认创建的是空数组只......
  • 【JavaScript21】关于Storage
    本地存储.存储在浏览器端的数据.可以理解成一个小型的非关系型数据库.localStorage和sessionStorage这俩玩意使用上是一样的.区别在于.一个是永久存储一个是临时存储.localStorage永久存储sessionStorage临时存储,浏览器关闭后.数据就没了.document.cookie也......
  • AtCoder Beginner Contest 313
    AtCoderBeginnerContest313A-ToBeSaikyo思路:找到最大的,和第一个比较#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong//#defineint__int128#definedoublelongdoubletypedefpair<int,int>PII;typedefpair<string,int>PSI;t......
  • FAST协议详解1 不同数据类型的编码与解码
    一、概述FAST协议里不同的数据类型在编码时有非常大的区别,比如整数只需要将二进制数据转为十进制即可,而浮点数则需要先传小数点位数,再传一个整数,最后将二者结合起来才是最终结果。本篇使用openfast自设了一些数据并编码成FAST数据,再对这些FAST数据进行人工解码,以图看懂FAST协议是......
  • 【刷题笔记】8. String to Integer (atoi)
    题目Implementthe myAtoi(strings) function,whichconvertsastringtoa32-bitsignedinteger(similartoC/C++'s atoi function).Thealgorithmfor myAtoi(strings) isasfollows:Readinandignoreanyleadingwhitespace.Checkifthenextcharact......
  • Junit - 如何测试List
    背景测试过程中,需要校验查询列表返回数据的正确性。常见的需求如:验证查询条件正确性:输入某查询条件,验证返回结果的List所有记录的该字段均为输入条件;验证数据正确性:验证查询结果中,某字段不能为空,某字段一定需要>0,某字段是个List,但是List的Size一定不为0;添加数据后,查询......
  • 如何使用Microsoft List的评级功能促进用户的协作和决策
    博客链接:https://blog.51cto.com/u_13637423MicrosoftLists是一个多功能的应用程序列表,可以使团队有效地组织、跟踪和共享相关信息,在MicrosoftLists中有一个非常重要且有趣的功能:Rate(评级)功能,用户可以针对列表中的项目完成评级并提供反馈。本文将给大家介绍如何启用MicrosoftLis......
  • webstorm无法启动、重装后无法启动(mac)
    #删除配置信息目录rm-rf~/Library/Preferences/WebStorm*#删除插件信息目录rm-rf~/Library/Application\Support/WebStorm*#缓存信息目录rm-rf~/Library/Caches/WebStorm*#删除日志信息目录rm-rf~/Library/Logs/WebStorm*#删除Webstorm.vmoptions......
  • Apipost接口自动化测试入门
    今天我们来聊一聊接口自动化测试。以往我们都是以以代码的形式编写自动化测试脚本做自动化测试,网上也有非常多的攻略,那么在不会代码的情况下该怎么做接口自动化呢,今天给大家介绍Apipost自动化测试模块,不用写代码也能做接口自动化!点击左侧菜单栏「自动化测试」按钮进入自动化测试页......