您的位置:首页 > 编程语言 > C语言/C++

POJ 3264

2015-07-13 23:26 471 查看
线段树,求区间上的最大值和最小值之差。水题,套模板即可。

不会起变量名是硬伤,呜呜呜~~~

AC代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxx 50005
int max0[maxx<<2],min0[maxx<<2];
void find_m(int rt)
{
max0[rt]=max(max0[rt<<1],max0[rt<<1|1]);
min0[rt]=min(min0[rt<<1],min0[rt<<1|1]);
//cout<<max0[rt]<<" "<<min0[rt]<<endl;
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&max0[rt]);
min0[rt]=max0[rt];
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
find_m(rt);
}
int query1(int left,int right,int l,int r,int rt)
{
if(left<=l&&right>=r)
return max0[rt];
int ans=0;
int m=(l+r)>>1;
if(left<=m)
ans=max(ans,query1(left,right,lson));
if(right>m)
ans=max(ans,query1(left,right,rson));
return ans;
}
int query2(int left,int right,int l,int r,int rt)
{
if(left<=l&&right>=r)
return min0[rt];
int ans=999999999;
int m=(l+r)>>1;
if(left<=m)
ans=min(ans,query2(left,right,lson));
if(right>m)
ans=min(ans,query2(left,right,rson));
return ans;
}

int main()
{
int n,q;
int a,b;
while(scanf("%d%d",&n,&q)!=EOF)
{
build(1,n,1);
while(q--)
{
scanf("%d%d",&a,&b);
printf("%d\n",query1(a,b,1,n,1)-query2(a,b,1,n,1));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM C++ 线段树 poj