poj 3264 Balanced Lineup(线段树、RMQ)
题目链接: http://poj.org/problem?id=3264
思路分析:
典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解。
在线段树结点中存储区间中的最小值与最大值;查询时使用线段树的查询
方法并稍加修改即可进行查询区间中最大与最小值的功能。
代码(线段树解法):
- #include <limits>
- #include <cstdio>
- #include <iostream>
- using namespace std;
- const int MAX_N = ;
- const int N_VAL = + ;
- struct SegTreeNode
- {
- int valMin, valMax;
- };
- SegTreeNode segTree[MAX_N];
- int val[N_VAL];
- int valMax, valMin;
- int Max(int a, int b) { return a > b ? a : b; }
- int Min(int a, int b) { return a > b ? b : a; }
- void Build(int root, int nbegin, int nend, int arr[])
- {
- if (nbegin == nend)
- {
- segTree[root].valMax = arr[nbegin];
- segTree[root].valMin = arr[nbegin];
- }
- else
- {
- int mid = (nbegin + nend) / ;
- Build( * root, nbegin, mid, arr);
- Build( * root + , mid + , nend, arr);
- segTree[root].valMax = Max(segTree[ * root].valMax, segTree[ * root + ].valMax);
- segTree[root].valMin = Min(segTree[ * root].valMin, segTree[ * root + ].valMin);
- }
- }
- void Query(int root, int nbegin, int nend, int qbegin, int qend)
- {
- if (nbegin > qend || nend < qbegin)
- return;
- if (qbegin <= nbegin && qend >= nend)
- {
- if (valMax < segTree[root].valMax)
- valMax = segTree[root].valMax;
- if (valMin > segTree[root].valMin)
- valMin = segTree[root].valMin;
- return;
- }
- int mid = (nbegin + nend) / ;
- Query( * root, nbegin, mid, qbegin, qend);
- Query( * root + , mid + , nend, qbegin, qend);
- }
- int main()
- {
- int qbegin, qend;
- int count = , N, Q;
- scanf("%d%d", &N, &Q);
- while (count++ < N)
- scanf("%d", &val[count]);
- Build(, , N, val);
- while (Q--)
- {
- valMax = INT_MIN, valMin = INT_MAX;
- scanf("%d%d", &qbegin, &qend);
- Query(, , N, qbegin, qend);
- printf("%d\n", valMax - valMin);
- }
- return ;
- }
代码(RMQ解法):
- #include <cstdio>
- #include <cmath>
- #include <iostream>
- using namespace std;
- const int MAX_L = ;
- const int MAX_N = + ;
- int height[MAX_N];
- int max_h[MAX_N][MAX_L], min_h[MAX_N][MAX_L];
- void RmqMaxInit(int n)
- {
- for (int j = ; j < MAX_L; ++j)
- {
- for (int i = ; i < n; ++i)
- {
- if (j == )
- max_h[i][j] = height[i];
- else
- {
- max_h[i][j] = max_h[i][j - ];
- int p = i + ( << (j - ));
- if (p < n)
- {
- if (max_h[p][j - ] > max_h[i][j])
- max_h[i][j] = max_h[p][j - ];
- }
- }
- }
- }
- }
- int RmqMaxQuery(int l, int r)
- {
- if (l > r)
- {
- int temp = l;
- l = r;
- r = temp;
- }
- int k = log(r - l + ) / log();
- return max_h[l][k] > max_h[r - ( << k) + ][k] ?
- max_h[l][k] : max_h[r - ( << k) + ][k];
- }
- void RmqMinInit(int n)
- {
- for (int j = ; j < MAX_L; ++j)
- {
- for (int i = ; i < n; ++i)
- {
- if (j == )
- min_h[i][j] = height[i];
- else
- {
- min_h[i][j] = min_h[i][j - ];
- int p = i + ( << (j - ));
- if (p < n)
- {
- if (min_h[p][j - ] < min_h[i][j])
- min_h[i][j] = min_h[p][j - ];
- }
- }
- }
- }
- }
- int RmqMinQuery(int l, int r)
- {
- if (l > r)
- {
- int temp = l;
- l = r;
- r = temp;
- }
- int k = log(r - l + ) / log();
- return min_h[l][k] < min_h[r - ( << k) + ][k] ?
- min_h[l][k] : min_h[r - ( << k) + ][k];
- }
- int main()
- {
- int num_len, query_num;
- scanf("%d %d", &num_len, &query_num);
- for (int i = ; i < num_len; ++i)
- scanf("%d", &height[i]);
- RmqMaxInit(num_len);
- RmqMinInit(num_len);
- for (int i = ; i < query_num; ++i)
- {
- int l = , r = ;
- int min_height = , max_height = ;
- scanf("%d %d", &l, &r);
- max_height = RmqMaxQuery(l - , r - );
- min_height = RmqMinQuery(l - , r - );
- printf("%d\n", max_height - min_height);
- }
- return ;
- }
poj 3264 Balanced Lineup(线段树、RMQ)的更多相关文章
- 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 ...
- POJ 3264 Balanced Lineup 线段树 第三题
Balanced Lineup Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line ...
- POJ 3264 Balanced Lineup (线段树)
Balanced Lineup For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the s ...
- POJ - 3264 Balanced Lineup 线段树解RMQ
这个题目是一个典型的RMQ问题,给定一个整数序列,1~N,然后进行Q次询问,每次给定两个整数A,B,(1<=A<=B<=N),求给定的范围内,最大和最小值之差. 解法一:这个是最初的 ...
- 【POJ】3264 Balanced Lineup ——线段树 区间最值
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 34140 Accepted: 16044 ...
- poj 3264 Balanced Lineup 区间极值RMQ
题目链接:http://poj.org/problem?id=3264 For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) alw ...
- Poj 3264 Balanced Lineup RMQ模板
题目链接: Poj 3264 Balanced Lineup 题目描述: 给出一个n个数的序列,有q个查询,每次查询区间[l, r]内的最大值与最小值的绝对值. 解题思路: 很模板的RMQ模板题,在这 ...
- POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 53703 Accepted: 25237 ...
随机推荐
- SSH框架的简化
---恢复内容开始--- 一.简易化的SSH框架,如图: SSH框架的搭建,我就不多说了. 二.简易的ssh框架的步骤: 1.重新编写applicationContext.xmlwen文件 <一 ...
- Hive和Jdbc示例
重要:在使用 JDBC 开发 Hive 程序时, 必须首先开启 Hive 的远程服务接口.使用下面命令进行开启:hive -service hiveserver & 1). 测试数据 user ...
- 纯JS URL编解码
function urlEncode(str) { var ret = ""; var strSpecial = "!\"#$%&’()*+,/:;&l ...
- js函数绑定同时,如何保留代码执行环境?
经常写js的程序员一定不会对下面这段代码感到陌生. var EventUtil = { addHandler : function(element, type, handler){ if(elemen ...
- Ie浏览器TextBox文本未居中
Ie浏览器TextBox文本未居中,而其他浏览器无问题时,可能原因是未设置垂直居中 vertical-align:middle
- StringBuffer&Runtime demo
public class StringBufferDemo02 { public static void main(String[] args) { StringBuffer ...
- mysqldump 利用rr隔离实现一致性备份
mysqldump -p -S /data/mysqldata1/sock/mysql.sock --single-transaction --master-data=2 --database db1 ...
- Jsoup代码解读之四-parser
Jsoup代码解读之四-parser 作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性.这部分也是Jsoup最复杂的部分,需要一些数据结构.状态机乃至编译器的知识.好 ...
- 对开发中常见的内存泄露,GDI泄露进行检测
对开发中常见的内存泄露,GDI泄露进行检测 一.GDI泄露检测方法: 在软件测试阶段,可以通过procexp.exe 工具,或是通过任务管理器中选择GDI对象来查看软件GDI的对象是使用情况. 注意点 ...
- VS2010/MFC常用控件:图片控件Picture Control
图片控件Picture Control 本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到 ...