RMQ(区间最值查询 模板)
发布日期:2021-11-02 09:48:42
浏览次数:2
分类:技术文章
本文共 1053 字,大约阅读时间需要 3 分钟。
RMQ(Range Minimum/Maximum Query)
目的:针对多次询问区间的最值问题。
RMQ算法一般用较长时间做预处理。 时间复杂度:为O(nlogn),可以在O(1)的时间内处理每次查询。解释
二维数组 dp[i][j] 表示从第 i 位开始连续 2j 个数中的最小值。
求 d p [ i ] [ j ] dp[i][j] dp[i][j] 的时候可以把它分成两部分: 第一部分是从 i i i 到 i + 2 j − 1 − 1 i+2^{j-1}-1 i+2j−1−1, 第二部分从 i + 2 j − 1 i+2^{j-1} i+2j−1 到 i + 2 j − 1 i+2^j-1 i+2j−1。 因为二进制数前一个数是后一个的两倍,那么可以把 i i i 到 i + 2 j − 1 i+2^{j-1} i+2j−1 这个区间通过 2 j − 1 2^{j-1} 2j−1 分成相等的两部分, 那么转移方程很容易就写出来了。 ( d p [ i ] [ 0 ] dp[i][0] dp[i][0] 就表示第 i 个数字本身) d p [ i ] [ j ] = m i n ( d p [ i ] [ j − 1 ] , d p [ i + ( 1 < < j − 1 ) ] [ j − 1 ] ) dp[i][j] = min(dp [i][j - 1], dp [i + (1 << j - 1)][j - 1]) dp[i][j]=min(dp[i][j−1],dp[i+(1<<j−1)][j−1])模板代码
void rmq_init() { for (int i = 1; i <= N; i++) //初始化,arr为初始输入数组 dp[i][0] = arr[i]; for (int j = 1; (1 << j) <= N; j++) for (int i = 1; i + (1 << j) - 1 <= N; i++) dp[i][j] = min(dp[i][j - 1], dp[i + (1 << j - 1)][j - 1]);}int rmq_query(int l, int r) { int k = log2(r - l + 1); return min(dp[l][k], dp[r - (1 << k) + 1][k]);}
转载地址:https://blog.csdn.net/weixin_43820352/article/details/108564042 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年03月25日 02时03分36秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LeetCode题解(1724):检查边长度限制的路径是否存在II(Python)
2019-04-26
文件服务器实现基本条件!
2019-04-26
文件服务器-活动目录的讨论
2019-04-26
文件服务器-活动目录的安装
2019-04-26
文件服务器-OU的概念!
2019-04-26
XP HOME 版本的 限制!
2019-04-26
VISTA版本!
2019-04-26
VMware GSX3.2 安装WINDOWS 2008!(1)
2019-04-26
VMware GSX3.2 安装WINDOWS 2008!(2)
2019-04-26
OE问题解决一例!
2019-04-26
利用LDIFDE,CSVDE 批量导出用户!
2019-04-26
ArcServer 无法正常启动,卸载IE7.0!
2019-04-26
为我加油吧-CTO 冲!
2019-04-26
阿里云云RDS mysql 数据库怎么样?应该怎么使用?
2019-04-26
阿里云数据库(RDS)是什么,与传统数据库有什么区别?
2019-04-26
创建一个网站会遇到哪些坑,避免不必要的麻烦.
2019-04-26
国内三大云巨头-阿里云,华为云,腾讯云之间的较量!
2019-04-26
国内云服务器哪家好?该怎么选择?
2019-04-26
【Linux】一步一步学Linux——alias命令(205)
2019-04-26
【Linux】一步一步学Linux——unalias命令(206)
2019-04-26