您的位置:首页 > 其它

POJ 3264 Balanced Lineup [RMQ]

2012-05-23 21:45 483 查看
求区间最大值与最小值之差。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const int maxn = 50010;
int n, q, a, b;
int minh[maxn][16]; // minh[i][j]: h[i]~h[i+(1<<j)-1]的最小值
int maxh[maxn][16];
int h[maxn];

void RMQ()
{
for (int i = 1; i <= n; ++i)
{
minh[i][0] = h[i];
maxh[i][0] = h[i];
}
for (int j = 1; (1 << j) <= n; ++j)
{
for (int i = 1; i + (1 << j) - 1 <= n; ++i)
{
minh[i][j] = min(minh[i][j-1], minh[i+(1<<(j-1))][j-1]);
maxh[i][j] = max(maxh[i][j-1], maxh[i+(1<<(j-1))][j-1]);
}
}
}

int query(int L, int R)
{
int k = (int)(log((double)R - L + 1) / log(2.0));
return max(maxh[L][k], maxh[R+1-(1<<k)][k])
- min(minh[L][k], minh[R+1-(1<<k)][k]);
}

int main()
{
scanf("%d %d", &n, &q);
for (int i = 1; i <= n; ++i)
scanf("%d", &h[i]);
RMQ();
for (int i = 0; i < q; ++i)
{
scanf("%d %d", &a, &b);
printf("%d\n", query(a, b));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: