POJ 3264 Balanced Lineup
2014-11-19 17:26
218 查看
线段树模板题,多次询问区间内最大值和最小值的差
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define maxn 50005 #define INF 1000005 struct node { int l; int r; int Max; int Min; }tree[maxn*4]; int a[maxn]; int Maxv,Minv; void build_tree(int pos,int left,int right){ tree[pos].l=left; tree[pos].r=right; if(left==right){ tree[pos].Max=a[left]; tree[pos].Min=a[left]; return; } int mid=(left+right)/2; build_tree(pos*2,left,mid); build_tree(pos*2+1,mid+1,right); tree[pos].Max=max(tree[pos*2].Max,tree[pos*2+1].Max); tree[pos].Min=min(tree[pos*2].Min,tree[pos*2+1].Min); } void query(int u,int left,int right){ if(tree[u].l==left&&tree[u].r==right){ Maxv=max(tree[u].Max,Maxv); Minv=min(tree[u].Min,Minv); return; } int mid=(tree[u].l+tree[u].r)/2; if(mid>=right){ query(u*2,left,right); } else if(mid<left){ query(u*2+1,left,right); } else{ query(u*2,left,mid); query(u*2+1,mid+1,right); } } int main(){ int N,Q; while(scanf("%d %d",&N,&Q)!=EOF){ for(int i=1;i<=N;i++){ scanf("%d",&a[i]); } build_tree(1,1,N); int a,b; for(int i=1;i<=Q;i++){ Maxv=-INF; Minv=INF; scanf("%d %d",&a,&b); query(1,a,b); printf("%d\n",Maxv-Minv); } } return 0; }
相关文章推荐
- POJ 3264 Balanced Lineup (RMQ)
- Poj 3264 Balanced Lineup
- poj 3264 Balanced Lineup
- POJ 3264 Balanced Lineup-初入算法 线段树
- poj_3264 Balanced Lineup 线段树+点修改/RMQ
- POJ 3264 Balanced Lineup(简单RMQ)
- 【RMQ】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 (RMQ问题)
- 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 区间查询(两棵树求最大最小值)