[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 } 
时间: 2024-12-01 17:24:26

[USACO07JAN]Balanced Lineup的相关文章

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

题面:P2880 [USACO07JAN]平衡的阵容Balanced Lineup RMQ问题:给定一个长度为N的区间,M个询问,每次询问Li到Ri这段区间元素的最大值/最小值. RMQ的高级写法一般有两种,即为线段树(并不很会╥﹏╥...)和ST表(一种利用dp求解区间最值的倍增算法) 定义:maxx[i][j]和minn[i][j]分别表示i到i+2^j-1这段区间的最大值和最小值. 预处理:maxx[i][0]=minn[i][0]=a[i].即i到i区间的最大值.最小值都是a[i]. 状

P2880 [USACO07JAN]平衡的阵容Balanced Lineup

P2880 [USACO07JAN]平衡的阵容Balanced Lineup RMQ RMQ模板题 静态求区间最大/最小值 (开了O2还能卡到rank9) #include<iostream> #include<cstdio> #include<cstring> #include<cctype> using namespace std; template <typename T> inline T min(T &a,T &b) {

poj 3264 Balanced Lineup RMQ线段树实现

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 36613   Accepted: 17141 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer Joh

bzoj 1637: [Usaco2007 Mar]Balanced Lineup

1637: [Usaco2007 Mar]Balanced Lineup Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的坐标(范围: 0..1,000,000,000)和种族(0或1). 一直以来 Farmer John 总是喜欢做一些非凡的事,当然这次照相也不例外.他只给一部分牛照相,并且这一组牛的阵容必须是"

bzoj 1699: [Usaco2007 Jan]Balanced Lineup排队 分块

1699: [Usaco2007 Jan]Balanced Lineup排队 Time Limit: 5 Sec  Memory Limit: 64 MB Description 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 <= Q <= 180,000) 个可能的牛的

poj3264 Balanced Lineup(求区间的最大值与最小值之差)

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 37869   Accepted: 17751 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer Joh

POJ3264 Balanced Lineup 线段树 RMQ ST算法应用

Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 36813 Accepted: 17237 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John de

poj 3264 Balanced Lineup

题目链接:http://poj.org/problem?id=3264 题目大意:就是给你一串数,问你最大数和最小数的差值....... 思路:最基本的线段树,只需要建树和查询,修改都省啦,但是查询要写两个,一个查询最大值,一个查询最小值......然后就能AC掉.....但是话说poj把它分类到RMQ中.... code: #include<cstdio> #include<cmath> #include<algorithm> #include<iostream

POJ3264 Balanced Lineup RMQ 线段树

求区间内最大数和最小数的差,用两棵线段树,一个维护区间最大值,一个维护区间最小值. #include <stdio.h> #include <vector> #include <math.h> #include <string.h> #include <string> #include <iostream> #include <queue> #include <list> #include <algori