RMQ 模板】的更多相关文章

原题大意:原题链接 给定元素无重复数组,查询给定区间内元素是否连续 解体思路:由于无重复元素,所以如果区间内元素连续,则该区间内的最大值和最小值之差应该等于区间长度(r-l) 解法一:线段树(模板题) #include<cstdio> #include<algorithm> #define inf 0x3f3f3f3f using namespace std; ; int va,curmi,curma; *maxn],ma[*maxn]; void Build(int p,int…
题目链接: 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:线段树也可以解…
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…
RMQ:范围最小值问题.给出一个n个元素的数组A1,A2,...,An,设计一个数据结构支持查询操作Query(L,R):计算min{AL,AL+1,...,AR}. 每次用一个循环来求最小值显然不够快快,前缀和的思想也不能提高效率,这时候ST算法就派上用场了,它预处理的时间是O(nlogn),但是查询只需要Q(1),而且常数很小. 令dp[i][j]表示从i开始的,长度为2^j的一段元素中的最小值,递推公式:dp[i][j]=min{dp[i][j-1],dp[i+2^(j-1)][j-1]}…
int main(){ ; i <= n; i++) ; j <= m; j++) { scanf("%d", &val[i][j]); dp[i][j][][] = val[i][j]; } ; ( << i) <= n; i++) { ; ( << j) <= m; j++) { && j == ) continue; ; row + ( << i) - <= n; row++) ; col…
1128 - 咸鱼拷问 Time Limit:3s Memory Limit:128MByte Submissions:380Solved:118 DESCRIPTION 给你两个序列A,B.每个序列有N个元素,我们定义第i个位置的咸鱼值为min(A[i],A[i-1]…A[i-B[i]+1])*max(A[i],A[i-1]….A[i-B[i]+1]).. 现在咸鱼王想知道所有的咸鱼值,于是抓住了你,让你回答这道题.你能回答他吗? INPUT 第一行包括一个整数N(1<=N<=1e5) 第二…
How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10764    Accepted Submission(s): 3923 Problem Description There are n houses in the village and some bidirectional roads connecting…
部分题目来自<算法竞赛设计进阶> 问题       给定一个长度为n的数列A,有m个询问,每次给定一个整数T,求出最大的k,满足a[1],a[2]……a[k]的和小于等于T(不会打sigma) 第一反应是二分,这个时候的复杂度是logn 还有第二种解法,用倍增的思想,复杂度为logk(所求答案).显然倍增要好很多.我讲讲倍增. 如果是暴力的话显然是从前往后一个一个枚举来计算.这里每次只往后移了一格,我们能不能一下子移很多格呢? 当然可以,我们可以用倍增的思想,第一次移1格,第二次移2格……如果…
题目:点这里 题意:给一个长度n的数列,然后又Q个询问,问L   到R   中最大值与最小值的差. 分析:RMQ 的模板题. 代码: #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; ; int minm,maxm; ],dp_min[max_][]; int a[max_]; void RMQ_init(int n…
Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2377    Accepted Submission(s): 859 Problem Description Paul draw a big m*n matrix A last month, whose entries Ai,j are all intege…
好久没做rmq的题了,今天写了一遍,感觉打表有点像区间dp /* 给定长为n的字符串,要求在字符串中选择k个字符, 选择的子系列字典序最小 因为选择k个字符,那么就是去掉n-k个字符 那么[1,n-k+1]位中必定选择一个字符 设这个字符在t1位 然后[t1,n-k+2]位中必定选择一个字符 设这个字符在t2位 以此类推 那么问题就是求区间最小字符的下标 rmq即可 */ #include<bits/stdc++.h> using namespace std; #define maxn 100…
题目链接:http://poj.org/problem?id=3368 题意:给出n个数和Q个询问(l,r),对于每个询问求出(l,r)之间连续出现次数最多的次数. 求解RMQ问题的算法有:搜索(比较暴力),线段树,ST算法(DP),其中较为高效的是ST算法,比较常用, 复杂度:预处理O(nlogn),查询O(1). RMQ算法(ST)请参考:http://blog.csdn.net/liang5630/article/details/7917702 分析:将原序列转换一下,if(num[i]=…
;i<n;i++) d[i][]=A[i]; ;(<<j)<=n;j++) ;i+(<<j)-<n;i++) ],d[i+(<<(j-))][j-]);   {      ;      ;<<(k+)<=R-L+;k++);      <<k)+][k]);      }…
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 50000 + 12; int A[maxn]; int dmax[maxn][40]; int dmin[maxn][40]; void init(int *A, int n){ for (int i = 1; i <= n; ++i) dmin[i][0] = dmax[i][0] = A[i]; for(int…
int a[1100]; int dp[maxn][20]; void rmq_init(){ for(int i=0;i<n;i++) dp[i][0]=a[i]; for(int j=1;(1<<j)<=n;j++) for(int i=0;i+(1<<j)-1<n;i++){ dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); } } int rmq(int l,int r){ int k=0; whi…
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…
题目链接 贴个板子.. #include<bits/stdc++.h> using namespace std; int n,q; ],d1[][],d2[][]; void RMQ_init() //预处理 { ;i<n;++i) d1[i][]=d2[i][]=a[i]; ;(<<j)<=n;j++) ;i+(<<j)-<n;i++) { d1[i][j]=min(d1[i][j-],d1[i+(<<(j-))][j-]); d2[i]…
和hdu2888基本上一样的,也是求一个矩阵内的极值 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define maxn 252 int n,b,q; ][],dpmin[maxn][maxn][][],val[maxn][maxn]; void ST(){ int k…
http://hihocoder.com/problemset/problem/1067代码: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <string> #include <queue> #include &…
<题目链接> 题目大意: 给定一段序列,进行q次询问,输出每次询问区间的最大值与最小值之差. 解题分析: RMQ模板题,用ST表求解,ST表用了倍增的原理. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; ; int n,q; ll maxsum[M][],mi…
<题目链接> 题目大意:给你一段序列,进行q次区间查询,每次都输出询问区间内的最小值. 解题分析: RMQ模板题,下面用在线算法——ST算法求解.不懂ST算法的可以看这篇博客  >>> #include <cstdio> #include<cstring> #include <cmath> #include <algorithm> using namespace std; ; int n,q; ]; //表示从第i个数起连续2^…
#include<iostream> #include<cstdio> #include<string.h> #include<string> #include<stack> #include<set> #include<algorithm> #include<cmath> #include<vector> #include<map> #define ll __int64 #define…
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1174 题意:中文题诶- 思路:RMQ模板题 关于RMQ: http://blog.csdn.net/liang5630/article/details/7917702 代码: #include <bits/stdc++.h> #define MAXN 10010 using namespace std; ], a[MAXN]; //dp[i][j]存储从下…

RMQ

1.概念: RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值. 2.解决方法: 对于该问题,最容易想到的解决方案是遍历,复杂度是O(n).但当数据量非常大且查询很频繁时,该算法无法在有效的时间内查询出正解.这里介绍了一种比较高效的在线算法(ST算法)解决这个问题.所谓在线算法,是指用户每输入一个查询便马上处理一个查询.该算法一般用较长…
上学期刷过裸的RMQ模板题,不过那时候一直不理解>_< 其实RMQ很简单: 设f[i][j]表示从i开始的,长度为2^j的一段元素中的最小值or最大值 那么f[i][j]=min/max{d[i][j-1], d[i+2^j-1][j-1]} RMQ的ST算法: void ST() //初始化 { memset(RMQ,,sizeof(RMQ)); ;i<=n;i++) RMQ[i][]=a[i]; ;(<<j)<=n;j++) ;i+(<<j)-<=…
RMQ问题小结 by Wine93 2014.1.14   1.算法简介 RMQ问题可分成以下2种 (1)静态RMQ:ST算法 一旦给定序列确定后就不在更新,只查询区间最大(小)值!这类问题可以用倍增的ST算法进行预处理 预处理:O(nlogn) 查询:O(1) (2)动态RMQ:线段树 要更新一些值,还有询问 更新:O(logn) 查询:O(logn) 2.相关题目 (1)静态RMQ 1.POJ 3264 Balanced Lineup(一维静态RMQ模板题) http://poj.org/p…
在做poj2406的时候...按论文给的rmq模板会超内存...然后网上找了http://blog.csdn.net/libin56842/article/details/46310425这位大爷的da3rmq就过了= = #include <iostream> #include <stdio.h> #include <string.h> #include <stack> #include <queue> #include <map>…
题目传送门 Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7963   Accepted: 3822 Description FJ has decided to grow his own corn hybrid in order to help the cows make the best possible milk. To that end, he's looking to build the c…
解题关键:rmq模板题,可以用st表,亦可用线段树等数据结构 log10和log2都可,这里用到了对数的换底公式 类似于区间dp,用到了倍增的思想 $F[i][j] = \min (F[i][j - 1],F[i + 1 <  < (j - 1)][j - 1])$ #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath&…