POJ - 3264 Balanced Lineup(线段树)
2015-10-20 23:33
369 查看
题目大意:给你N个数,然后询问,询问的是区间内最大值和最小值的差
解题思路:线段树的裸题了,维护最大值和最小值即可
解题思路:线段树的裸题了,维护最大值和最小值即可
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int N = 50010 << 2; int n, q; int val , Min , Max ; void PushUp(int u) { Max[u] = max(Max[u << 1], Max[u << 1 | 1]); Min[u] = min(Min[u << 1], Min[u << 1 | 1]); } void build(int u, int l, int r) { if (l == r) { Max[u] = Min[u] = val[l]; return ; } int mid = (l + r) >> 1; build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r); PushUp(u); } int query(int u, int l, int r, int L, int R, int flag) { if (L <= l && r <= R) { if (flag) return Max[u]; else return Min[u]; } int mid = (l + r) >> 1; int ans = INF; if (flag) ans = -INF; if (L <= mid) { if (flag) ans = max(ans, query(u << 1, l, mid, L, R, flag)); else ans = min(ans, query(u << 1, l, mid, L, R, flag)); } if (R > mid) { if (flag) ans = max(ans, query(u << 1 | 1, mid + 1, r, L, R, flag)); else ans = min(ans, query(u << 1 | 1, mid + 1, r, L, R, flag)); } return ans; } void solve() { for (int i = 1; i <= n; i++) scanf("%d", &val[i]); build(1, 1, n); int a, b; while (q--) { scanf("%d%d", &a, &b); printf("%d\n", query(1, 1, n, a, b, 1) - query(1, 1, n, a, b, 0)); } } int main() { while (scanf("%d%d", &n, &q) != EOF) solve(); return 0; }
相关文章推荐
- php 匹配字符串中的连续数字
- 单链表的Java实现
- 云计算服务模型,第 1 部分: 基础架构即服务(IaaS)
- 自定义LinkedList
- Java IO8:IO简单总结
- 技术小故事-Activity的Launch Mode引起的动画“疑案”
- Eclipse与Mysql驱动连接的问题
- Android空数据页面提示控件
- Android 新特性 - TabLayout
- HDOJ 动态规划总结
- Unity中欧拉角与四元数的文档整理(旋转)
- 使用构造代码块精炼程序
- ZOJ - 1610 Count the Colors(线段树)
- 谷歌搜索语法
- [LeetCode]Reverse Linked List
- 2015/10/20 类似UItarBarController 界面 设计 微博项目 自定义键盘
- NYOJ 469 擅长排列的小明 II
- 10月20日
- java 字符串匹配
- Android定位入门(1)了解定位管理器--LocationManager 类