POJ 3264 Balanced Lineup
2014-09-03 14:44
309 查看
poj.org/problem?id=3264
线段数的单点更新维护区间的最值。
线段数的单点更新维护区间的最值。
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int MAX = 50000; const int INF = 1e9; struct node{ int l, r, up, down; int mid(){ return (l + r) >> 1; } }tree[MAX << 2]; int Max,Min; void buildtree(int l, int r, int rt){ tree[rt].l = l; tree[rt].r = r; if(l == r){ scanf("%d",&tree[rt].up); tree[rt].down = tree[rt].up; return; } int mid = tree[rt].mid(); buildtree(l, mid, rt << 1); buildtree(mid + 1, r, rt << 1 | 1); tree[rt].up = max(tree[rt << 1].up, tree[rt << 1 | 1].up); tree[rt].down = min(tree[rt << 1].down, tree[rt << 1 | 1].down); } void query(int l, int r, int rt){ if(tree[rt].l >= l && tree[rt].r <= r){ Max = max(tree[rt].up, Max); Min = min(tree[rt].down, Min); return; } int mid = tree[rt].mid(); if(r <= mid) query(l, r, rt << 1); else if(l > mid) query(l, r, rt << 1 | 1); else{ query(l, mid, rt << 1), query(mid + 1, r, rt << 1 | 1); } } int main(){ // freopen("in.txt", "r", stdin); int N,Q; while(scanf("%d%d",&N,&Q) != EOF){ buildtree(1, N, 1); int l,r; for(int i=0; i<Q; i++){ scanf("%d%d",&l,&r); Min = INF; Max = -INF; query(l, r, 1); printf("%d\n",Max - Min); } } return 0; }
相关文章推荐
- poj 3264 Balanced Lineup
- poj 3264 Balanced Lineup
- POJ3264 Balanced Lineup(RMQ)
- POJ 3264 Balanced Lineup 线段树
- POJ 3264 Balanced Lineup(线段树)
- Balanced Lineup (POJ_3264) 线段树+区间查询
- POJ 3264 Balanced Lineup
- poj 3264 Balanced Lineup
- Poj 3264 Balanced Lineup - 线段树
- POJ 3264-Balanced Lineup, NYOJ 119-士兵杀敌3 线段树
- POJ-3264 Balanced Lineup RMQ
- POJ 3264 Balanced Lineup (RMQ)
- POJ 3264 Balanced Lineup(线段树)
- (转)POJ 3264 - Balanced Lineup (线段树)
- poj 3264 Balanced Lineup
- poj 3264 Balanced Lineup (线段树)
- POJ 题目3264 Balanced Lineup(RMQ)
- POJ - 3264:Balanced Lineup
- POJ-3264 Balanced Lineup
- POJ - 3264 Balanced Lineup(线段树维护最值)