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;
}

 

posted @ 2013-12-22 15:53  莞中OI  阅读(171)  评论(0)    收藏  举报