线段树查询区间最值poj 3264 Balanced Lineup

Posted shulin~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树查询区间最值poj 3264 Balanced Lineup相关的知识,希望对你有一定的参考价值。

技术分享
 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 const int maxn=50005;
 6 struct Seg
 7 {
 8     int l,r,mi,ma;
 9 }tree[maxn*4];
10 int val[maxn];
11 
12 void build(int l,int r,int i=1)
13 {
14     tree[i].l=l;
15     tree[i].r=r;
16     if (l==r)
17     {
18         tree[i].mi=val[l];
19         tree[i].ma=val[l];
20     }
21     else
22     {
23         int mid=l+r>>1;
24         build(l,mid,i<<1);
25         build(mid+1,r,i<<1|1);
26         tree[i].mi=min(tree[i<<1].mi,tree[i<<1|1].mi);
27         tree[i].ma=max(tree[i<<1].ma,tree[i<<1|1].ma);
28     }
29 }
30 
31 int querymi(int l,int r,int i=1)
32 {
33     if (tree[i].l==l && tree[i].r==r) return tree[i].mi;
34     int mid=tree[i].l+tree[i].r>>1;
35     if (r<=mid) return querymi(l,r,i<<1);
36     if (l>mid) return querymi(l,r,i<<1|1);
37     return min(querymi(l,mid,i<<1),querymi(mid+1,r,i<<1|1));
38 }
39 
40 int queryma(int l,int r,int i=1)
41 {
42     if (tree[i].l==l && tree[i].r==r) return tree[i].ma;
43     int mid=tree[i].l+tree[i].r>>1;
44     if (r<=mid) return queryma(l,r,i<<1);
45     if (l>mid) return queryma(l,r,i<<1|1);
46     return max(queryma(l,mid,i<<1),queryma(mid+1,r,i<<1|1));
47 }
48 
49 int main()
50 {
51     int n,m;
52     scanf("%d%d",&n,&m);
53     for (int i=1;i<=n;i++) scanf("%d",&val[i]);
54     build(1,n);
55     for (int i=0;i<m;i++)
56     {
57         int l,r;
58         scanf("%d%d",&l,&r);
59         printf("%d\n",queryma(l,r)-querymi(l,r));
60     }
61     return 0;
62 }
View Code

 

以上是关于线段树查询区间最值poj 3264 Balanced Lineup的主要内容,如果未能解决你的问题,请参考以下文章

poj 3264(线段树求区间最值)

POJ3264线段树求最值

POJ - 3264(线段树实现)

POJ 3264 Balanced Lineup线段树区间查询求最大值和最小值

poj3264------线段树

[POJ 3264] Balanced Lineup [线段树]