您的位置:首页 > 其它

[kuangbin带你飞]专题七 线段树 G POJ 3264

2016-09-22 09:29 411 查看
题目地址:https://vjudge.net/contest/66989#problem/G

思路:求区间最大值和最小值的差。模板题,拍个模板就过了,没发现有什么坑。

AC代码:

#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=5e5+10;

struct seq{
int n1,n2,l,r;//n1最大,n2最小
}T[maxn*4];

void build(int l,int r,int k)
{
T[k].l=l,T[k].r=r;
if(l==r)
{
scanf("%d",&T[k].n1);
T[k].n2=T[k].n1;
return;
}
int mid=(l+r)>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
T[k].n1=max(T[k<<1].n1,T[k<<1|1].n1);
T[k].n2=min(T[k<<1].n2,T[k<<1|1].n2);
}

int ans1,ans2;
void search(int l,int r,int k)
{
if(T[k].l==l && T[k].r==r)
{
ans1=max(ans1,T[k].n1);
ans2=min(ans2,T[k].n2);
return;
}
//printf("%d\n",k);
int mid=(T[k].l+T[k].r)>>1;
if(r<=mid)
search(l,r,k<<1);
else if(l>mid)
search(l,r,k<<1|1);
else
{
search(l,mid,k<<1);
search(mid+1,r,k<<1|1);
}
}

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