题意:
给定一个整数序列,以及查找序列,输出查找范围[i,j]中最大值与最小值之差
解法:
一个最大值RMQ,一个最小值RMQ
跑了3400MS
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <queue>
using namespace std;
///宏定义
const int INF = 990000000;
const int maxn = 50010 ;
const int MAXN = maxn;
///全局变量 和 函数
int max(int a, int b)
{
return a > b ? a : b;
}
int min(int a, int b)
{
return a < b ? a : b;
}
//
// 区间最*大*值
const int maxlog = 20;
struct RMQ
{
int d[maxn][maxlog];
void init(const vector<int>& A)
{
int n = A.size();
for(int i = 0; i < n; i++)
d[i][0] = A[i];
for(int j = 1; (1<<j) <= n; j++)
for(int i = 0; i + (1<<j) - 1 < n; i++)
d[i][j] = max(d[i][j-1], d[i + (1<<(j-1))][j-1]);
}
int query(int L, int R)
{
int k = 0;
while((1<<(k+1)) <= R-L+1) k++; // 如果2^(k+1)<=R-L+1,那么k还可以加1
return max(d[L][k], d[R-(1<<k)+1][k]);
}
};
struct RMQ1
{
int d[maxn][maxlog];
void init(const vector<int>& A)
{
int n = A.size();
for(int i = 0; i < n; i++)
d[i][0] = A[i];
for(int j = 1; (1<<j) <= n; j++)
for(int i = 0; i + (1<<j) - 1 < n; i++)
d[i][j] = min(d[i][j-1], d[i + (1<<(j-1))][j-1]);
}
int query(int L, int R)
{
int k = 0;
while((1<<(k+1)) <= R-L+1) k++; // 如果2^(k+1)<=R-L+1,那么k还可以加1
return min(d[L][k], d[R-(1<<k)+1][k]);
}
};
//
int n, q;
RMQ rmq;
RMQ1 rmq1;
int main()
{
///变量定义
int i, j;
while (scanf("%d %d", &n, &q) != EOF)
{
vector<int> vec;
for (i = 0; i < n; i++)
{
int height;
scanf("%d", &height);
vec.push_back(height);
}
rmq.init(vec);
rmq1.init(vec);
for (i = 0; i < q; i++)
{
int s, e;
scanf("%d %d", &s, &e);
int maxv = rmq.query(s - 1, e - 1);
int minv = rmq1.query(s - 1, e - 1);
printf("%d\n", maxv - minv);
}
}
///结束
return 0;
}