http://hihocoder.com/problemset/problem/1067代码: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <string> #include <queue> #include &…
[概述]      RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值. 一般解决这类区间问题可以用线段树来做,比较通用.但是线段树的代码量有点多.这里介绍另一种算法,ST(Sparse Table)算法. ST(Sparse Table)算法是一个非常有名的在线处理RMQ问题的算法,它可以在O(nlogn)时间内进行预处理,然后在O(…
1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值.这两个问题是在实际应用中经常遇到的问题,下面介绍一下解决这两种问题的比较高效的算法.当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍. 2.RMQ算法 对于该问题,最容易想到的解决方案是遍历,复杂度是O(n).但当数据量…
写在前面: 记录了个人的学习过程,同时方便复习 Sparse Table 有些情况,需要反复读取某个指定范围内的值而不需要修改 逐个判断区间内的每个值显然太浪费时间 我们希望用空间换取时间 ST表就是为此存在的 在一维二维甚至三维中,利用动态规划的思想,将区域反复切割直到不能再分 每一次切割产生的范围都可以存储想要的值: 在生成时找好获得值的方法 查询时找好获取值得关系 在储存时,由于分割总是分成两半(横着来一下,竖着来一下就是四段) 利用这个性质,就能高效的用2k或者2kn,2km表示每个分割…
原题链接:http://codeforces.com/problemset/problem/359/D 思路:首先对符合题目的长度(r-l)从0到n-1进行二分查找,对每一个长度进行check,看是否满足条件. 满足条件的话需要区间[l,r]内的最小值和最大公约数相等,如果暴力搜索,会超时,故采用st(sparse table)算法,建立table只需要O(nlgn)时间,查询是O(1),远远小于暴力搜索 st算法具体可参考http://baike.baidu.com/view/1536346.…
题目链接: Poj 3264 Balanced Lineup 题目描述: 给出一个n个数的序列,有q个查询,每次查询区间[l, r]内的最大值与最小值的绝对值. 解题思路: 很模板的RMQ模板题,在这里总结一下RMQ:RMQ(Range Minimum/Maximum Query) 即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值. RMQ有三种求法:1:直接遍历查找,炒鸡暴力: 2:线段树也可以解…
RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为 n的数列A,回答若干次询问RMQ(i,j),返回数列A中下标在区间[i,j]中的最小/大值. 这个有很多算法:这里介绍一种比较高效的ST算法解决这个问题.ST(Sparse Table)算法可以 在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询. 令dp(i,j)表示从  i  开始的,长度为 2^j  的一段中元素的最小值, 即可以递推出dp(i,j)=min(d…
原题大意:原题链接 给定元素无重复数组,查询给定区间内元素是否连续 解体思路:由于无重复元素,所以如果区间内元素连续,则该区间内的最大值和最小值之差应该等于区间长度(r-l) 解法一:线段树(模板题) #include<cstdio> #include<algorithm> #define inf 0x3f3f3f3f using namespace std; ; int va,curmi,curma; *maxn],ma[*maxn]; void Build(int p,int…
http://poj.org/problem?id=3264 题意:给出n个数,还有q个询问,询问[l,r]区间里面最大值和最小值的差值. 思路:RMQ模板题,开两个数组维护最大值和最小值就行. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50010 #define INF 0x3f3f3f3…
题意:有n头牛,输入他们的身高,求某区间身高的极值的差(max-min), 用RMQ模板,同时构造求极大值和极小值的两个数组. //poj3264 #include <iostream> #include <string> #include <cstring> #include <queue> #include <vector> #include <cstdio> #include<cmath> using namespa…