Poj 3264 Balanced Lineup

来源:互联网 发布:淘宝店铺店标怎么弄的 编辑:程序博客网 时间:2024/05/16 18:52

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

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

#include <stdio.h>#include <math.h>int n,q;#define MAXN 50010int dp_max[MAXN][20];int dp_min[MAXN][20];int num[MAXN];//存储数据信息,从0到n-1int 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;}


原创粉丝点击