POJ3264Balanced Lineup题解-线段树

#include<stdio.h>
#include<iostream>
using namespace std;
struct node {  
    int left;
    int right;
    int max;
    int min;
}a[5000000];
int p[5000000];
void build(int l, int r, int k){
    a[k].left=l;
    a[k].right=r;
    if(l==r){
        a[k].max=a[k].min=p[r];
        return;
    }
    a[k].min=1000000000;
    a[k].max=-1000000000;
    build(l,(l+r)/2,k*2);
    build((l+r)/2+1,r,k*2+1);
}
int ansmax,ansmin,l;
void query(int l, int r, int k) {  
    if(l==a[k].left && r==a[k].right) { 
        ansmax=max(a[k].max,ansmax);
        ansmin=min(a[k].min,ansmin);
        return ;  
    }  
    if(a[k].left == a[k].right)  
        return ;  
    int mid = (a[k].left + a[k].right)/2;  
    if(r<=mid)  
        query(l, r, k*2);  
    else if(l>mid)
        query(l, r, k*2+1);
    else {  
        query(l, mid, k*2);  
        query(mid+1, r, k*2+1);  
    }  
} 
int work2(int k){
    if(a[k*2].right==0)return a[k].max;
    int a1=work2(k*2),a2=work2(k*2+1);
    a[k].max=max(a1,a2);
    return a[k].max;
}
int work3(int k){
    if(a[k*2].right==0)return a[k].max;
    int a1=work3(k*2),a2=work3(k*2+1);
    a[k].min=min(a1,a2);
    return a[k].min;
}
int main(){
    int i,n,m,k,x,y,z;
    scanf("%d",&n);
    scanf("%d",&m);
    for(i=1;i<=n;i++)
        scanf("%d",&p[i]);
    build(1,n,1);
    work2(1);
    work3(1);
    for(i=1;i<=m;i++){
        ansmax=-100000000;
        ansmin=100000000;
        scanf("%d%d",&x,&y);
        query(x,y,1);
        printf("%d\n",ansmax-ansmin);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值