poj3264(简单线段树)

题目链接:https://vjudge.net/problem/POJ-3264

题意:线段树简单应用题,区间查询最大值和最小值的差。

思路:用线段树维护区间的最大值和最小值即可。

AC代码:

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=50005;

struct node{
    int l,r,Max,Min;
}tr[maxn<<2];

int n,Q,a[maxn],ans1,ans2;

void build(int v,int l,int r){
    tr[v].l=l,tr[v].r=r;
    if(l==r){
        tr[v].Max=tr[v].Min=a[l];
        return;
    }
    int mid=(tr[v].l+tr[v].r)>>1;
    build(v<<1,l,mid);
    build(v<<1|1,mid+1,r);
    tr[v].Max=max(tr[v<<1].Max,tr[v<<1|1].Max);
    tr[v].Min=min(tr[v<<1].Min,tr[v<<1|1].Min);
}

void query(int v,int l,int r){
    if(l<=tr[v].l&&r>=tr[v].r){
        ans1=max(ans1,tr[v].Max);
        ans2=min(ans2,tr[v].Min);
        return;
    }
    int mid=(tr[v].l+tr[v].r)>>1;
    if(l<=mid)
        query(v<<1,l,r);
    if(r>mid)
        query(v<<1|1,l,r);
}

int main(){
    scanf("%d%d",&n,&Q);
    for(int i=1;i<=n;++i)
        scanf("%d",&a[i]);
    build(1,1,n);
    while(Q--){
        int a,b;
        scanf("%d%d",&a,&b);
        ans1=0,ans2=0x3f3f3f3f;
        query(1,a,b);
        printf("%d\n",ans1-ans2);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/FrankChen831X/p/10848178.html