1. 程式人生 > >BZOJ 1699 Usaco Balanced lineup

BZOJ 1699 Usaco Balanced lineup

define line 最小 for usaco log scan fin sin

線段樹區間最大最小值模板題目

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4  
 5 #define lson(x) ((x)<<1)
 6 #define rson(x) ((x)<<1|1)
 7  
 8 using std::max;
 9 using std::min;
10  
11 const int maxn=55555;
12 const int INF=0x3f3f3f3f;
13  
14 int
Max[maxn<<2],Min[maxn<<2]; 15 int num[maxn]; 16 17 void pushup(int x){ 18 Max[x] = max(Max[lson(x)],Max[rson(x)]); 19 Min[x] = min(Min[lson(x)],Min[rson(x)]); 20 } 21 22 void Build(int x,int L,int R){ 23 if(L==R){ 24 Max[x]=Min[x]=num[L]; 25 return
; 26 } 27 int mid = (L+R)>>1; 28 Build(lson(x),L,mid); 29 Build(rson(x),mid+1,R); 30 pushup(x); 31 } 32 33 int queryMin(int x,int L,int R,int l,int r){ 34 if(l<=L && R<=r) return Min[x]; 35 int mid = (L+R)>>1; 36 int ans = INF; 37
if(l<=mid) ans = min(ans,queryMin(lson(x),L,mid,l,r)); 38 if(r>mid) ans = min(ans,queryMin(rson(x),mid+1,R,l,r)); 39 return ans; 40 } 41 42 int queryMax(int x,int L,int R,int l,int r){ 43 if(l<=L && R<=r) return Max[x]; 44 int mid = (L+R>>1); 45 int ans = 0; 46 if(l<=mid) ans = max(ans,queryMax(lson(x),L,mid,l,r)); 47 if(r>mid) ans = max(ans,queryMax(rson(x),mid+1,R,l,r)); 48 return ans; 49 } 50 51 int main(){ 52 int n,q; 53 scanf("%d%d",&n,&q); 54 for(int i=1;i<=n;i++) scanf("%d",&num[i]); 55 Build(1,1,n); 56 for(int i=1;i<=q;i++){ 57 int x,y; 58 scanf("%d%d",&x,&y); 59 int MAX = queryMax(1,1,n,x,y); 60 int MIN = queryMin(1,1,n,x,y); 61 printf("%d\n",MAX-MIN); 62 } 63 return 0; 64 }

BZOJ 1699 Usaco Balanced lineup