TOJ1698/POJ3264Balanced Lineup (线段树 or RMQ-ST)
传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1698
时间限制(普通/Java):5000MS/50000MS 内存限制:65536KByte
描述
For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous range of cows from the milking lineup to play the game. However, for all the cows to have fun they should not differ too much in height.
Farmer John has made a list of Q (1 ≤ Q ≤ 200,000) potential groups of cows and their heights (1 ≤ height ≤ 1,000,000). For each group, he wants your help to determine the difference in height between the shortest and the tallest cow in the group.
输入
Line 1: Two space-separated integers, N and Q.
Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i
Lines N+2..N+Q+1: Two integers A and B (1 ≤ A ≤ B ≤ N), representing the range of cows from A to B inclusive.
输出
Lines 1..Q: Each line contains a single integer that is a response to a reply and indicates the difference in height between the tallest and shortest cow in the range.
样例输入
6 3
1
7
3
4
2
5
1 5
4 6
2 2
样例输出
6
3
0
思路:题目大意就是,给n个数m个查询,下面行输入n个数。m行输入m个查询,查询最大值和最小值的差。
rmq-st模板题。拿来练手的。作为丢人的初学线段树选手,也附上手打的线段树代码。
RMQ-ST代码:
- #include<iostream>
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- #include<string>
- #include<cstdlib>
- #include<cmath>
- #include<stack>
- #include<queue>
- #include<set>
- #include<map>
- #include<vector>
- #define LL long long
- #include<assert.h>
- using namespace std;
- int a[],dm[][],dx[][];
- void rmq(int num){
- for(int i = ; i < num ; i++){
- dm[i][] = dx[i][] = a[i];
- }
- for(int j = ; (<<j) <= num ; j++){
- for(int i = ;i+(<<j)- < num ;i ++){
- dx[i][j] = max(dx[i][j-],dx[i+(<<(j-))][j-]);
- dm[i][j] = min(dm[i][j-],dm[i+(<<(j-))][j-]);
- }
- }
- }
- int qmax(int st,int ed){
- int k = ;
- while((<<(k+))<= ed - st + )k++;
- return max(dx[st][k],dx[ed - (<<k) + ][k]);
- }
- int qmin(int st,int ed){
- int k = ;
- while((<<(k+))<= ed - st + )k++;
- return min(dm[st][k],dm[ed - (<<k) + ][k]);
- }
- int main(){
- int n,k;
- while(~scanf("%d %d",&n,&k)){
- memset(dx,,sizeof(dx));
- memset(dm,,sizeof(dm));
- for(int i = ; i < n ; i++)scanf("%d",&a[i]);
- rmq(n);
- while(k--){
- int x,y;
- scanf("%d %d",&x,&y);
- printf("%d\n",qmax(x-,y-)-qmin(x-,y-));
- }
- }
- }
线段树代码:
- #include<cstdio>
- #include<algorithm>
- #include<iostream>
- using namespace std;
- const int maxn = ;
- struct note{
- int l,r;
- int nMin,nMax;
- }segTree[maxn<<];
- int Max,Min;
- int a[maxn];
- void build(int i,int l,int r){
- segTree[i].l = l;
- segTree[i].r = r;
- if(l==r){
- segTree[i].nMin = segTree[i].nMax = a[l];
- return;
- }
- int mid = (l+r)>>;
- build(i<<,l,mid);
- build(i<<|,mid+,r);
- segTree[i].nMax = max(segTree[i<<].nMax,segTree[i<<|].nMax);
- segTree[i].nMin = min(segTree[i<<].nMin,segTree[i<<|].nMin);
- }
- void query(int i,int l,int r){
- if(segTree[i].nMax <= Max && segTree[i].nMin >= Min){
- return;
- }
- if(segTree[i].l == l && segTree[i].r == r){
- Max = max(segTree[i].nMax,Max);
- Min = min(segTree[i].nMin,Min);
- return;
- }
- int mid = (segTree[i].l + segTree[i].r) >> ;
- if(r <= mid)
- query(i<<,l,r);
- else if(l > mid)
- query(i<<|,l,r);
- else{
- query(i<<,l,mid);
- query(i<<|,mid+,r);
- }
- }
- int main(){
- int n,m;
- while(~scanf("%d %d",&n,&m)){
- for(int i = ; i <= n ;i++)scanf("%d",&a[i]);
- build(,,n);
- while(m--){
- int x,y;
- Max = -;Min = ;
- scanf("%d %d",&x,&y);
- query(,x,y);
- printf("%d\n",Max-Min);
- }
- }
- }
TOJ1698/POJ3264Balanced Lineup (线段树 or RMQ-ST)的更多相关文章
- poj 3264 Balanced Lineup(线段树、RMQ)
题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...
- POJ - 3264 Balanced Lineup 线段树解RMQ
这个题目是一个典型的RMQ问题,给定一个整数序列,1~N,然后进行Q次询问,每次给定两个整数A,B,(1<=A<=B<=N),求给定的范围内,最大和最小值之差. 解法一:这个是最初的 ...
- POJ3264Balanced Lineup 线段树练手
题目意思:给定Q(1<=Q<=200000)个数A1,A2,```,AQ,多次求任一区间Ai-Aj中最大数和最小数的差 #include <iostream> #include ...
- POJ-3264 Balanced Lineup(区间最值,线段树,RMQ)
http://poj.org/problem?id=3264 Time Limit: 5000MS Memory Limit: 65536K Description For the daily ...
- POJ 3368 Frequent values 线段树与RMQ解法
题意:给出n个数的非递减序列,进行q次查询.每次查询给出两个数a,b,求出第a个数到第b个数之间数字的最大频数. 如序列:-1 -1 1 1 1 1 2 2 3 第2个数到第5个数之间出现次数最多的是 ...
- 线段树+RMQ问题第二弹
线段树+RMQ问题第二弹 上篇文章讲到了基于Sparse Table 解决 RMQ 问题,不知道大家还有没有印象,今天我们会从线段树的方法对 RMQ 问题再一次讨论. 正式介绍今天解决 RMQ 问题的 ...
- POJ - 3264 Balanced Lineup(线段树或RMQ)
题意:求区间最大值-最小值. 分析: 1.线段树 #include<cstdio> #include<cstring> #include<cstdlib> #inc ...
- POJ 3264 Balanced Lineup 线段树RMQ
http://poj.org/problem?id=3264 题目大意: 给定N个数,还有Q个询问,求每个询问中给定的区间[a,b]中最大值和最小值之差. 思路: 依旧是线段树水题~ #include ...
- [POJ] 3264 Balanced Lineup [线段树]
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 34306 Accepted: 16137 ...
随机推荐
- E2040 Declaration terminated incorrectly - System.ZLib.hpp(310) ZLIB_VERSION
[bcc32 Error] System.ZLib.hpp(310): E2040 Declaration terminated incorrectly Full parser context ...
- git异常
1. SSL certificate problem: self signed certificate 因git默认是ssl方式验证,在采用http请求时,是使用的账号密码方式,因此需要git放行. ...
- native.js 判断是否安装某app
例:是否安装微信 function isWeixin() { var UIApplication = plus.ios.importClass("UIApplication"); ...
- debian9 下编译安装tengine2.2.1
首先下载tengine的源码包,这个大家都会下载吧 wget http://tengine.taobao.org/download/tengine-2.2.1.tar.gz 然后解压缩 tar zxf ...
- Java泛型类型擦除以及类型擦除带来的问题
目录 1.Java泛型的实现方法:类型擦除 1-2.通过两个例子证明Java类型的类型擦除 2.类型擦除后保留的原始类型 3.类型擦除引起的问题及解决方法 3-1.先检查,再编译以及编译的对象和引用传 ...
- ArcGIS案例学习笔记_3_2_CAD数据导入建库
ArcGIS案例学习笔记_3_2_CAD数据导入建库 计划时间:第3天下午 内容:CAD数据导入,建库和管理 目的:生成地块多边形,连接属性,管理 问题:CAD存在拓扑错误,标注位置偏移 教程:pdf ...
- shiro 认证思路
- 吴裕雄 09-MySQL删除数据表
以下为删除MySQL数据表的通用语法:DROP TABLE table_name; DROP TABLE runoob_tbl; 使用PHP脚本删除数据表PHP使用 mysqli_query 函数来删 ...
- Java 中 == 和 equals 的区别
有一段时间,== 和 equals 的区别一直困扰着我.因为涉及到Java的内存机制,然而Java的内存机制又是比较抽象的东西,所以对那时候的我来说,实在是很难理解. == 和 equals 最大的区 ...
- scala spark 聚类
import org.apache.spark.ml.clustering.KMeansimport org.apache.spark.ml.evaluation.ClusteringEvaluato ...