POJ3264(RMQ模板)
阿新 • • 發佈:2018-12-10
Balanced Lineup
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 66277 | Accepted: 30847 | |
Case Time Limit: 2000MS |
Description
For the daily milking, Farmer John's N cows (1 ≤ N
Farmer John has made a list of Q (1 ≤ Q ≤ 200,000) potential groups of cows and their heights (1 ≤ height ≤ 1,000,000). For each group, he wants your help to determine the difference in height between the shortest and the tallest cow in the group.
Input
Line 1: Two space-separated integers, N
Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i
Lines N+2..N+Q+1: Two integers A and B (1 ≤ A ≤ B ≤ N), representing the range of cows from A to B inclusive.
Output
Lines 1..Q: Each line contains a single integer that is a response to a reply and indicates the difference in height between the tallest and shortest cow in the range.
Sample Input
6 3 1 7 3 4 2 5 1 5 4 6 2 2
Sample Output
6 3 0
Source
題意: 給你一組資料有q個詢問求l,r之間的最大值和最小值得差值
題解:rmq一個存小值一個存大值
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
using namespace std;
#define clr(a,b) memset(a,b,sizeof(a))
#define il inline
typedef long long ll;
const int maxn = 50000 + 2;
const int minn = 130 + 1;
int n,q,dpmax[maxn][20],dpmin[maxn][20];
void RMQ(int n)
{
for (int j = 0; j < 17; ++j)
{
for (int i = n; i > 0; --i)
{
if (i + (1 << j) <= n)
{
dpmax[i][j + 1] = max(dpmax[i][j], dpmax[i + (1 << j)][j]);
dpmin[i][j + 1] = min(dpmin[i][j], dpmin[i + (1 << j)][j]);
}
}
}
}
int querymax(int l, int r)
{
if (l > r) { return -1; }
int k=(int)(log(r-l+1.0)/log(2.0));
return max(dpmax[l][k], dpmax[r - (1 << k) + 1][k]);
}
int querymin(int l, int r)
{
if (l > r) { return -1; }
int k=(int)(log(r-l+1.0)/log(2.0));
return min(dpmin[l][k], dpmin[r - (1 << k) + 1][k]);
}
int main()
{
while (~scanf("%d%d", &n,&q))
{
clr(dpmax, 0);
clr(dpmin, 0);
int tm;
for (int i = 1; i <= n; ++i)
{
scanf("%d", &tm);
dpmax[i][0]=dpmin[i][0]=tm;
}
RMQ(n);
int l,r;
while(q--)
{
scanf("%d%d",&l,&r);
printf("%d\n",querymax(l,r)-querymin(l,r));
}
}
return 0;
}