POJ3264 Balanced Lineup 线段树基础

来源:互联网 发布:传智python视频百度云 编辑:程序博客网 时间:2024/05/17 20:32

第一次接触线段树。


题意:又见farmer john。

有N只牛,每只牛都有它的身高。

给出任意一个区间[i ,j],叫你求出这个第i只牛到第j只牛这些牛中身高最高的和最低的差值。

思路:线段树。

每个树节点有参数:

L=区间左值

R=区间右值

MAX=区间内身高最大值

MIN=区间内身高最小值


#include<iostream>#define max(a,b) (a>b?a:b)#define min(a,b) (a<b?a:b)using namespace std;const int SUM=150010;const int MAX=(1<<30);const int MIN=-1;struct Node{int l,r,mx,mn;}node[SUM];int mx,mn;int n,q;void buildtree(int index,int begin,int end){node[index].l=begin;node[index].r=end;node[index].mn=MAX;node[index].mx=MIN;if(begin==end){return;}int mid=(begin+end)/2;buildtree(index*2,begin,mid);buildtree(index*2+1,mid+1,end);}void insert(int index,int i,int value){if(node[index].l==i&&node[index].r==i){node[index].mn=value;node[index].mx=value;return ;}node[index].mn=min(node[index].mn,value);node[index].mx=max(node[index].mx,value);int mid=(node[index].l+node[index].r)/2;if(i<=mid){insert(index*2,i,value);}else{insert(index*2+1,i,value);}}void find(int index,int a,int b){if(node[index].l==a&&node[index].r==b){mx=max(node[index].mx,mx);mn=min(node[index].mn,mn);return;}int mid=(node[index].l+node[index].r)/2;if(b<=mid)find(index*2,a,b);else if(a>=mid+1)find(index*2+1,a,b);else{find(index*2,a,mid);find(index*2+1,mid+1,b);}}int main(){scanf("%d%d",&n,&q);buildtree(1,1,n);int h;for(int i=1;i<=n;i++){scanf("%d",&h);insert(1,i,h);}int a,b;for(int i=1;i<=q;i++){mn=MAX;mx=MIN;scanf("%d%d",&a,&b);find(1,a,b);printf("%d\n",mx-mn);}return 0;}