POJ 3264

来源:互联网 发布:淘宝收藏店铺怎么删除 编辑:程序博客网 时间:2024/04/29 09:22

线段树模板题,而且还不用更新;

只需要开两个树,一个记录小一个记录大就可以了:

以下是代码:

#include<stdio.h>#include<algorithm>#include<string.h>#include<iostream>#define INF 1000000#define MAXN 50002#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;int Max[MAXN<<2],Min[MAXN<<2];int input[MAXN];int n,m;struct ansreturn{    int maxans,minans;};void PushUp(int rt){    Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);    Min[rt]=min(Min[rt<<1],Min[rt<<1|1]);    return;}void build(int l,int r,int rt){    if(l==r)    {        Max[rt]=input[l];        Min[rt]=input[l];        return;    }    int m=(l+r)>>1;    build(lson);    build(rson);    PushUp(rt);    return;}ansreturn query(int ll,int rr,int l,int r,int rt){    ansreturn ans;    ansreturn temp;    if(ll<=l&&rr>=r)    {        ans.maxans=Max[rt];        ans.minans=Min[rt];        return ans;    }    int m=(l+r)>>1;    ans.maxans=-INF;    ans.minans=INF;    if(ll<=m)    {        temp=query(ll,rr,lson);        ans.maxans=max(ans.maxans,temp.maxans);        ans.minans=min(ans.minans,temp.minans);    }    if(rr>m)    {        temp=query(ll,rr,rson);        ans.maxans=max(ans.maxans,temp.maxans);        ans.minans=min(ans.minans,temp.minans);    }    return ans;}int main(){    int x,y;    ansreturn ans;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i=1;i<=n;i++) scanf("%d",&input[i]);        build(1,n,1);        for(int i=0;i<m;i++)        {            scanf("%d%d",&x,&y);            ans=query(x,y,1,n,1);            printf("%d\n",ans.maxans-ans.minans);        }    }    return 0;}


0 0
原创粉丝点击