您的位置:首页 > 其它

【再见RMQ】NYOJ-119-士兵杀敌(三),区间内大小差值

2015-05-06 23:30 381 查看
【题目链接:NYOJ-119

  思路:转自 点我 ,讲的挺好。

#include <cstdio>
#include <math.h>
#define max(a,b) ((a>b)?a:b)
#define min(a,b) (a<b?a:b)
const int maxn=100010;
int h[maxn];
int mx[maxn][20],mn[maxn][20];
int n,q;
void rmq_init(){
int i,j,t;
for(j=1;j<=n;j++) mx[j][0]=mn[j][0]=h[j];
int m=floor(log((double)n)/log(2.0));
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
t = j+(1<<(i-1));
if(t<=n) mx[j][i]=max(mx[j][i-1],mx[t][i-1]);
else mx[j][i]=mx[j][i-1];
}
}
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
t = j+(1<<(i-1));
if(t<=n) mn[j][i]=min(mn[j][i-1],mn[t][i-1]);
else mn[j][i]=mn[j][i-1];
}
}
}
int rmq(int l,int r){
int m=floor(log((double)(r-l+1))/log(2.0));
int a=max(mx[l][m],mx[r-(1<<m)+1][m]);
int b=min(mn[l][m],mn[r-(1<<m)+1][m]);
return a-b;
}
int main(){
int i,l,r;
int T,C,L,R;
scanf("%d%d",&n,&q);
for(i = 1;i <= n;i++)
scanf("%d",&h[i]);
rmq_init();
while(q--){
scanf("%d%d",&L,&R);
printf("%d\n",rmq(L,R));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: