POJ 3264 Balanced Lineup(线段树水题)

来源:互联网 发布:兄弟连it教育怎么样 编辑:程序博客网 时间:2024/05/18 16:40

大概题意是查询区间内的最大值和最小值的差是多少....也算是区间内最大的差?都一样...很简单 都不用更新只有查询的水题.....我觉得肯定有其他办法....

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;struct node{    int l,r,maxi,mini;}data[300000];int maxm,minm;void build(int l,int r,int k){    data[k].l=l;    data[k].r=r;    if(l==r)    {        scanf("%d",&data[k].maxi);        data[k].mini=data[k].maxi;        return ;    }    int mid=(l+r)/2;    build(l,mid,k*2);    build(mid+1,r,k*2+1);    data[k].maxi=max(data[k*2].maxi,data[k*2+1].maxi);    data[k].mini=min(data[k*2].mini,data[k*2+1].mini);}void query(int l,int r,int k){    if(data[k].l==l&&data[k].r==r)    {        maxm=max(maxm,data[k].maxi);        minm=min(minm,data[k].mini);        return ;    }    int mid=(data[k].l+data[k].r)/2;    if(r<=mid)        query(l,r,k*2);    else if(l>=mid+1)        query(l,r,k*2+1);    else    {        query(l,mid,k*2);        query(mid+1,r,k*2+1);    }}int main(){    int n,q,a,b;    while(cin>>n>>q)    {        build(1,n,1);        for(int i=0;i<q;i++)        {            scanf("%d %d",&a,&b);            maxm=-10000000,minm=10000000;            query(a,b,1);            printf("%d\n",maxm-minm);        }    }    return 0;}


0 0
原创粉丝点击