基于稀疏表(Sparse Table)的RMQ(区间最值问题)
在RMQ的其他实现方法中,有一种叫做ST的算法比较常见。
【构建】
dp[i][j]表示的是从i起连续的2j个数xi,xi+1,xi+2,...xi+2j-1( 区间为[i,i+2j-1] )的最值。
状态转移方程dp[i][j]=max/min(dp[i][j-1], dp[i+2j-1][j-1])
【查询】
对于一个查询区间[x,y],只要找到一个或者多个2的整数倍长度的刚好区间覆盖[x,y] ,取这些区间最值的最值就是答案了。
如何把[x,y]覆盖完整?
一种办法是把区间的长度按照二进制分成多个2的整数倍区间,显然这些区间是不重叠的,这样求多次最值就能得到答案。不过这种发放增加了算法常数,一次查询可能就要求几十次最值。

还有种更好的方法,原理是:为了减少分割出的区间数量,允许区间重叠,这样所有的情况下最多只要两个区间就可以了:

只要求出k就好了,k=(int)((log(y-x+1.0)/log(2.0)))。
代码:
int input[maxn];
int dp1[maxn][],dp2[maxn][];
/*创建*/
void build(int n)
{
for(int i=; i<=n; i++) dp1[i][]=dp2[i][]=input[i];
int bitn=(int)(log(1.0*n)/log(2.0));
for(int j=; j<=bitn; j++)
{
for(int i=; i<=n; i++)
{
if(i+(<<(j-))->n) break;
dp1[i][j]=max(dp1[i][j-],dp1[i+(<<(j-))][j-]);
dp2[i][j]=min(dp2[i][j-],dp2[i+(<<(j-))][j-]);
}
}
} /*查询*/
int query(int l,int r)
{
int k=(int)(log(r-l+1.0)/log(2.0));
//return max(dp1[l][k],dp1[r-(1<<k)+1][k]);
//return min(dp2[l][k],dp2[r-(1<<k)+1][k]);
return max(dp1[l][k],dp1[r-(<<k)+][k])-min(dp2[l][k],dp2[r-(<<k)+][k]);
}
【更新】
基于稀疏表的RMQ在预处理时的时间和空间复杂度都达到了O(nlogn),并且无法高效的対值进行更新。
基于稀疏表(Sparse Table)的RMQ(区间最值问题)的更多相关文章
- RMQ区间最值查询
RMQ区间最值查询 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A, 回答若干询问RMQ(A,i,j)(i,j<= ...
- RMQ(区间最值问题)
问题: RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大) ...
- rmq区间最值
时间复杂度O(NlogN)+O(Q) int a[N]; int dpmax[N][20],dpmin[N][20]; void first(int n) { mm(dpmax,0); mm(dpmi ...
- RMQ (Range Minimal Query) 问题 ,稀疏表 ST
RMQ ( 范围最小值查询 ) 问题是一种动态查询问题,它不需要修改元素,但要及时回答出数组 A 在区间 [l, r] 中最小的元素值. RMQ(Range Minimum/Maximum Query ...
- ST (Sparse Table:稀疏表)算法
1541:[例 1]数列区间最大值 时间限制: 1000 ms 内存限制: 524288 KB提交数: 600 通过数: 207 [题目描述] 输入一串数字,给你 MM 个询问 ...
- 算法学习 - ST表 - 稀疏表 - 解决RMQ问题
2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ...
- RMQ ---- ST(Sparse Table)算法
[概述] RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返 ...
- 动态规划——稀疏表求解RMQ问题
RMQ (Range Minimum/Maximum Query)问题,即区间最值查询问题,是求解序列中的某一段的最值的问题.如果只需要询问一次,那遍历枚举(复杂度O(n))就是最方便且高效的方法,但 ...
- ST表 求 RMQ(区间最值)
RMQ即Range Minimum/Maximun Query,中文意思:查询一个区间的最小值/最大值 比如有这样一个数组:A{3 2 4 5 6 8 1 2 9 7},然后问你若干问题: 数组A下标 ...
随机推荐
- linux c 编程相关资料
1. linux下的错误定义及其错误捕获:http://blog.csdn.net/tigerjibo/article/details/6819891 2. 在线 c 系统调用手册 http://c. ...
- Java闰年的计算,Calendar的用法
Java闰年的计算,Calendar的用法 代码如下: package com.aaa.zuoye; import java.text.ParseException; import java.util ...
- Realtime Rendering 1.1
[Realtime Rendering 1.1] 1.A linear transform is one that preserves vector addition and scalar multi ...
- java和c#中String
java中: c#中: 1.拼接字符串 sql语句中 in() str="'001','002','003'";至于产生string就这样 str1="'001'&qu ...
- linux 升级python2.7
linux为centos6,系统默认安装了python2.6,需要执行的python脚本内容包含标准库之xml.etree.ElementTree 用到库里的一个iter方法是python2.7的新 ...
- 修改nginx日志格式为json
Nginx 日志默认为普通文本的格式 /Oct/::: +] "https://boss.zbt.com/finance/partner/create-account-gateway?id= ...
- Mysql 索引与Key
如果只是key的话,就是普通索引. mysql的key和index多少有点令人迷惑,单独的key和其它关键词结合的key(primary key)实际表示的意义是不同,这实际上考察对数据库体系结构的了 ...
- HDU-1069.MonkeyandBanana(LIS)
本题大意:给出n个长方体,每种长方体不限量,让你求出如何摆放长方体使得最后得到的总高最大,摆设要求为,底层的长严格大于下层的长,底层的宽严格大于下层的宽. 本题思路:一开始没有啥思路...首先应该想到 ...
- 153. Find Minimum in Rotated Sorted Array (Array; Divide-and-Conquer)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- 98. Validate Binary Search Tree (Tree; DFS)
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...