POJ 3264 Balanced Lineup

来源:互联网 发布:腾讯云 centos 7 pptp 编辑:程序博客网 时间:2024/06/02 03:55

题目大意

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

题目分析

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

#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,Rint 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;}
0 0