Poj 3264 Balanced Lineup

题目大意:有一排牛,给定每头牛的高度,然后有一系列的询问,即给出i,j,要求输出第i个牛和第j个牛之间的最高的牛和最矮的牛之间高度差值。

思路:典型的区间最值查询,获取最大值和最小值后相减即可。

#include <stdio.h>
#include <math.h>
int n,q;
#define MAXN 50010
int dp_max[MAXN][20];
int dp_min[MAXN][20];
int num[MAXN];//存储数据信息,从0到n-1
int get_max(int a, int b) {
	if (a>b)
		return a;
	return b;
}
int get_min(int a, int b) {
	if (a>b)
		return b;
	return a;
}
void RMQ_preproccess() {
	int i,j;
	for (i=0;i<n;i++) {
		dp_max[i][0]=num[i];
		dp_min[i][0]=num[i];
	}
	for (j=1;(1<<j)<=n;j++) {
		for (i=0;i+(1<<j)-1<n;i++) {
			dp_max[i][j]=get_max(dp_max[i][j-1],dp_max[i+(1<<(j-1))][j-1]);
			dp_min[i][j]=get_min(dp_min[i][j-1],dp_min[i+(1<<(j-1))][j-1]);
		}
	}
}
int RMQ_max(int s, int v) {
	int k=(int)(log((v-s+1)*1.0)/log(2.0));
    return get_max(dp_max[s][k],dp_max[v-(1<<k)+1][k]);
}
int RMQ_min(int s, int v) {
	int k=(int)(log((v-s+1)*1.0)/log(2.0));
    return get_min(dp_min[s][k],dp_min[v-(1<<k)+1][k]);
}
int main()
{
	int i;
	int s,v;

	scanf("%d%d",&n,&q);
	for (i=0;i<n;i++)
		scanf("%d",&num[i]);
	RMQ_preproccess();
	for (i=0;i<q;i++) {
		scanf("%d%d",&s,&v);
		s--;
		v--;
		printf("%d\n",RMQ_max(s,v)-RMQ_min(s,v));
	}
	return 0;
}


你可能感兴趣的:(Poj 3264 Balanced Lineup)