南阳 oj119 线段树 区间最值

来源:互联网 发布:java用户登录权限 编辑:程序博客网 时间:2024/05/18 00:57
/*  思路:线段树的区间查询,区间最值。  但是~~~~ 这时间 唉~~~~~~~~~~~~~  第二份代码 是过不了的。习惯了那样子写代码。  http://blog.csdn.net/lw277232240/article/details/77092634  这个网站是超级牛逼的线段树大总结大家可以看看*/#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 100000*4+10int n,m;int min1[MAX];int max1[MAX];int min2,max2;int min(int x,int y){    if(x<y) return x;    return y;}int max(int x,int y){    if(x>y) return x;    return y;}void build(int rt,int left,int right){    if(left==right)    {        scanf("%d",&min1[rt]);        max1[rt]=min1[rt];        return ;    }    else    {        int mid=(left+right)/2;        build(rt*2,left,mid);        build(rt*2+1,mid+1,right);        min1[rt]=min(min1[rt*2],min1[rt*2+1]);        max1[rt]=max(max1[rt*2],max1[rt*2+1]);    }}void query(int rt,int left,int right,int l,int r){    if(left>=l&&right<=r)    {        min2=min(min2,min1[rt]);        max2=max(max2,max1[rt]);        return ;    }    int mid=(left+right)/2;    if(l<=mid) query(rt*2,left,mid,l,r);    if(r>mid)  query(rt*2+1,mid+1,right,l,r);}int main(){    scanf("%d%d",&n,&m);    build(1,1,n);     int x,y;    for(int i=1;i<=m;i++)    {        scanf("%d%d",&x,&y);         max2=-1,min2=999999999;         query(1,1,n,x,y);         printf("%d\n",max2-min2);    }}
 //这份代码te的#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 100000*4+10int n,m;int min1[MAX];int max1[MAX];int min(int x,int y){    if(x<y) return x;    return y;}int max(int x,int y){    if(x>y) return x;    return y;}void build(int rt,int left,int right){    if(left==right)    {        scanf("%d",&min1[rt]);        max1[rt]=min1[rt];        return ;    }    else    {        int mid=(left+right)/2;        build(rt*2,left,mid);        build(rt*2+1,mid+1,right);        min1[rt]=min(min1[rt*2],min1[rt*2+1]);        max1[rt]=max(max1[rt*2],max1[rt*2+1]);    }}int query(int rt,int left,int right,int l,int r,int &min2){    if(left>=l&&right<=r)    {        min2=min1[rt];        return max1[rt];    }    int mid=(left+right)/2;    int p1=-1,p2=-1,m1=100000001,m2=100000001;    if(l<=mid) p1=query(rt*2,left,mid,l,r,m1);    if(r>mid)  p2=query(rt*2+1,mid+1,right,l,r,m2);    min2=min(m1,m2);    return max(p1,p2);}int main(){    scanf("%d%d",&n,&m);    build(1,1,n);     int x,y;       int min2,max2;    for(int i=1;i<=m;i++)    {        scanf("%d%d",&x,&y);         max2=query(1,1,n,x,y,min2);         printf("%d\n",max2-min2);    }}        


原创粉丝点击