DGZX1771 - 运动员的身高
比较明显的RMQ问题。对于给定的区间,需要快速回答出区间内的最大值和最小值。
#include <stdio.h>
#include <math.h>
#define max(a, b) (((a)>(b))?(a):(b))
#define min(a, b) (((a)<(b))?(a):(b))
const int maxn = 10001;
int n, m;
int h[maxn];
int dpmax[maxn][14], dpmin[maxn][14];
int main()
{
// input
scanf("%d %d", &n, &m);
for (int i=1; i<=n; i++)
scanf("%d", &h[i]);
// init
for (int i=1; i<=n; i++)
dpmax[i][0] = h[i], dpmin[i][0] = h[i];
for (int j=1; j<=log(1.0*n)/log(2.0); j++)
{
for (int i=1; i+(1<<j)-1<=n; i++)
{
dpmax[i][j] = max(dpmax[i][j-1], dpmax[i+(1<<(j-1))][j-1]);
dpmin[i][j] = min(dpmin[i][j-1], dpmin[i+(1<<(j-1))][j-1]);
}
}
// input
int a, b;
for (int i=1; i<=m; i++)
{
scanf("%d%d", &a, &b);
int k = (int)(log((b-a+1)*1.0)/log(2.0));
printf("%d\n", max(dpmax[a][k], dpmax[b-(1<<k)+1][k]) - min(dpmin[a][k], dpmin[b-(1<<k)+1][k]));
}
return 0;
}

浙公网安备 33010602011771号