您的位置:首页 > 其它

POJ 3264 Balanced Lineup

2016-05-17 18:21 246 查看

题目大意

就是给你奶牛的高度,并且站成一排,让你统计每一段奶牛中最高奶牛与最低奶牛的高度之差。

题目分析

用线段树维护区间最大值和最小值

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 50005;
const int INF = 0x3f3f3f3f;
#define mid (L+R)/2
#define lson o<<1,L,mid
#define rson o<<1|1,mid+1,R
int maxv[maxn<<2],minv[maxn<<2];
int a[maxn],Max,Min;

void pushup(int o)
{
maxv[o] = max(maxv[o<<1], maxv[o<<1|1]);
minv[o] = min(minv[o<<1], minv[o<<1|1]);
}

void build(int o,int L,int R)
{
if(L == R)
{
maxv[o] = minv[o] = a[L];
return ;
}
build(lson);
build(rson);
pushup(o);
}

void query(int o,int L,int R,int l,int r)
{
if(l <= L && R <= r)
{
Max = max(Max, maxv[o]);
Min = min(Min, minv[o]);
return ;
}
if(l <= mid)
query(lson, l, r);
if(r > mid)
query(rson, l ,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(1, 1, N);
while(Q--)
{
int x,y;
Max = -INF;
Min = INF;
scanf("%d %d", &x, &y);
query(1, 1, N, x, y);
printf("%d\n", Max - Min);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: