[USACO07JAN]Balanced Lineup

Posted skylee的OI博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO07JAN]Balanced Lineup相关的知识,希望对你有一定的参考价值。

OJ题号:
洛谷2880

思路:

线段树维护区间最大最小值。

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<utility>
 4 #include<algorithm>
 5 inline int getint() {
 6     char ch;
 7     bool sgn=false;
 8     while(!isdigit(ch=getchar())) if(ch==-) sgn=true;
 9     int x=ch^0;
10     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^0);
11     return sgn?-x:x;
12 }
13 const int inf=0x7fffffff;
14 const int N=50001;
15 class SegmentTree {
16     #define _left <<1
17     #define _right <<1|1
18     private:
19         int max[N<<2],min[N<<2];
20         void push_up(const int p) {
21             max[p]=std::max(max[p _left],max[p _right]);
22             min[p]=std::min(min[p _left],min[p _right]);
23         }
24     public:
25         void build(const int p,const int b,const int e) {
26             if(b==e) {
27                 max[p]=min[p]=getint();
28                 return;
29             }
30             int mid=(b+e)>>1;
31             build(p _left,b,mid);
32             build(p _right,mid+1,e);
33             push_up(p);
34         }
35         std::pair<int,int> query(const int p,const int b,const int e,const int l,const int r) {
36             if((b==l)&&(e==r)) {
37                 return std::make_pair(max[p],min[p]);
38             }
39             int mid=(b+e)>>1;
40             int max=0,min=inf;
41             if(l<=mid) {
42                 std::pair<int,int> tmp=query(p _left,b,mid,l,std::min(mid,r));
43                 max=std::max(max,tmp.first);
44                 min=std::min(min,tmp.second);
45             }
46             if(r>mid) {
47                 std::pair<int,int> tmp=query(p _right,mid+1,e,std::max(mid+1,l),r);
48                 max=std::max(max,tmp.first);
49                 min=std::min(min,tmp.second);
50             }
51             return std::make_pair(max,min);
52         }
53 };
54 SegmentTree t;
55 int main() {
56     int n=getint(),m=getint();
57     t.build(1,1,n);
58     while(m--) {
59         int l=getint(),r=getint();
60         std::pair<int,int> tmp=t.query(1,1,n,l,r);
61         printf("%d\n",tmp.first-tmp.second);
62     }
63     return 0;
64 } 

 

以上是关于[USACO07JAN]Balanced Lineup的主要内容,如果未能解决你的问题,请参考以下文章

[USACO07JAN]平衡的阵容Balanced Lineup RMQ模板题

luogu P2880 [USACO07JAN]平衡的阵容Balanced Lineup 题解

P2880 [USACO07JAN]平衡的阵容Balanced Lineup(RMQ的倍增模板)

P2880 [USACO07JAN]平衡的阵容Balanced Lineup

洛谷P2880 [USACO07JAN]平衡的阵容Balanced Lineup(st表)

[BZOJ] 1636: [Usaco2007 Jan]Balanced Lineup