您的位置:首页 > 其它

POJ 3264 Balanced Lineup【线段树】

2015-05-19 09:23 411 查看
题意:给出n个数,a1,a2,a3,---,an,再给出q次询问区间al到ar之间的最大值和最小值的差

学习线段树的第一道题目 学习的这一篇
http://www.cnblogs.com/kuangbin/archive/2011/08/14/2137862.html
#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

typedef long long LL;
const int INF = (1<<30)-1;
const int mod=1000000007;
const int maxn=1000005;

int a[maxn];
int nmax,nmin;

struct node{
int l,r;//记录区间的左右端点
int nmax,nmin;//记录区间的最大值,最小值
};

node tree[4*maxn];

void build_tree(int i,int l,int r){//建树
tree[i].l=l;
tree[i].r=r;
if(l==r){
tree[i].nmin=tree[i].nmax=a[l];
return;
}
int mid=(l+r)/2;
build_tree(2*i,l,mid);
build_tree(2*i+1,mid+1,r);
tree[i].nmin=min(tree[2*i].nmin,tree[2*i+1].nmin);
tree[i].nmax=max(tree[2*i].nmax,tree[2*i+1].nmax);
}

void query(int i,int l,int r){//查询
if(tree[i].nmin>=nmin&&tree[i].nmax<=nmax) return;
if(tree[i].l==l&&tree[i].r==r){
nmin = min(tree[i].nmin,nmin);
nmax = max(tree[i].nmax,nmax);
return;
}
int mid=(tree[i].l+tree[i].r)/2;
if(r<=mid) query(2*i,l,r);
else if(l>mid) query(2*i+1,l,r);
else{
query(2*i,l,mid);
query(2*i+1,mid+1,r);
}
}

int main(){
int n,q;
while(scanf("%d %d",&n,&q)!=EOF){
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build_tree(1,1,n);

while(q--){
nmin=INF;nmax=-INF;
int l,r;
scanf("%d %d",&l,&r);
query(1,l,r);
printf("%d\n",nmax-nmin);
}
}
return 0;
}


View Code

另外这道题用cin会超时
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: