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; }