您的位置:首页 > 其它

POJ-3264 RMQ

2011-11-21 19:56 197 查看
NOIP2011 2=收场,悲剧。

“长风破浪会有时,直挂云帆济沧海”

AC 3000+ms

/**
** poj-3264 balanced lineup
** mike-w
** 2011-11-21
** tag: RMQ
**/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define LIST_SIZE 100000
#define MAX_EXP 100
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))

int list[LIST_SIZE];
int rmin[LIST_SIZE][MAX_EXP],rmax[LIST_SIZE][MAX_EXP];
int N,Q;

int mktable(void)
{
int i,j;
for(i=1;i<=N;i++)
rmin[i][0]=rmax[i][0]=list[i];
for(j=1;j<=log(N)/log(2);j++)
for(i=1;i+(1<<j)-1<=N;i++)
{
rmin[i][j]=min(rmin[i][j-1],rmin[i+(1<<(j-1))][j-1]);
rmax[i][j]=max(rmax[i][j-1],rmax[i+(1<<(j-1))][j-1]);
}
return 0;
}

int rmq1(int l,int r)
{
int x=log(r-l+1)/log(2);
return max(rmax[l][x],rmax[r+1-(1<<x)][x]);
}

int rmq2(int l,int r)
{
int x=log(r-l+1)/log(2);
return min(rmin[l][x],rmin[r+1-(1<<x)][x]);
}

int main(void)
{
int i,a,b;
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
scanf("%d%d",&N,&Q);
for(i=1;i<=N;i++)
scanf("%d",list+i);
mktable();
for(i=1;i<=Q;i++)
{
scanf("%d%d",&a,&b);
printf("%d\n",rmq1(a,b)-rmq2(a,b));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  list