POJ 3264 Balanced Lineup (线段树)

来源:互联网 发布:马岛海战 知乎 编辑:程序博客网 时间:2024/06/15 03:47

区间查询最大与最小值,并求其差,两个query分别找最大最小求差就行了。。。4000+ms险过

#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<cstring>using namespace std;#define MAXN 50500struct segTree{    int minn,maxn;    int l,r;}tree[MAXN<<3];void build(int root,int ibegin,int iend){    tree[root].l=ibegin;    tree[root].maxn=0;    tree[root].minn=100000000;    tree[root].r=iend;    if(ibegin==iend) return;    int mid=(ibegin+iend)/2;    build(root*2+1,ibegin,mid);    build(root*2+2,mid+1,iend);}void update(int root,int laz, int x){    if(laz<tree[root].l||laz>tree[root].r)        return ;    if(tree[root].l==tree[root].r)    {        tree[root].maxn=max(tree[root].maxn,x);        tree[root].minn=min(tree[root].minn,x);        return;    }    int mid=(tree[root].l+tree[root].r)/2;    if(laz<=mid) update(root*2+1,laz,x);    else update(root*2+2,laz,x);    tree[root].maxn=max(tree[root*2+1].maxn,tree[root*2+2].maxn);    tree[root].minn=min(tree[root*2+1].minn,tree[root*2+2].minn);}int queryminn(int root,int ibegin,int iend){    if(iend<tree[root].l||ibegin>tree[root].r)        return -1;    if(tree[root].l==ibegin&&tree[root].r==iend)        return tree[root].minn;    int mid=(tree[root*2+1].l+tree[root*2+2].r)/2;    if(mid<ibegin) return queryminn(root*2+2,ibegin,iend);    else if(iend<=mid) return queryminn(root*2+1,ibegin,iend);    else return min(queryminn(root*2+1,ibegin,mid),                queryminn(root*2+2,mid+1,iend));}int querymaxn(int root,int ibegin,int iend){    if(iend<tree[root].l||ibegin>tree[root].r)        return -1;    if(tree[root].l==ibegin&&tree[root].r==iend)        return tree[root].maxn;    int mid=(tree[root*2+1].l+tree[root*2+2].r)/2;    if(mid<ibegin) return querymaxn(root*2+2,ibegin,iend);    else if(iend<=mid) return querymaxn(root*2+1,ibegin,iend);    else return max(querymaxn(root*2+1,ibegin,mid),                querymaxn(root*2+2,mid+1,iend));}int main(){    int n,q;int a;    while(cin>>n>>q)    {        build(0,1,n);        for(int i=1;i<=n;i++)        {            scanf("%d",&a);            update(0,i,a);        }        int l,r;        for(int i=1;i<=q;i++)        {            scanf("%d%d",&l,&r);            cout<<querymaxn(0,l,r)-queryminn(0,l,r)<<endl;        }    }}
原创粉丝点击