线段树求区间最大值与最小值的差
2012-10-27 10:34
441 查看
http://poj.org/problem?id=3264
#include <cmath> #include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define L(x) (x << 1) #define R(x) (x << 1 | 1) #define INT_MAX 0x7fffffff const int MAX = 50010; struct Tnode { int mmax,mmin,val; int l,r; }; Tnode node[MAX*3]; int v[MAX],big,small; void init() { memset(node,0,sizeof(node)); } void build(int t,int l,int r) { node[t].l=l; node[t].r=r; if(l==r-1) { node[t].mmin=v[l]; node[t].mmax=v[l]; return ; } int mid =(l+r)>>1; build(L(t),l,mid); build(R(t),mid,r); node[t].mmax=max(node[L(t)].mmax,node[R(t)].mmax); node[t].mmin=min(node[L(t)].mmin,node[R(t)].mmin); } void get(int t,int l,int r) { if(node[t].l==l&&node[t].r==r) { big=max(node[t].mmax,big); small=min(node[t].mmin,small); return ; } int mid=(node[t].l+node[t].r)>>1; if(l>=mid) get(R(t),l,r); else if(r<=mid) get(L(t),l,r); else { get(R(t),mid,r); get(L(t),l,mid); } } int main() { int n,m,x,y; while( ~scanf("%d%d",&n,&m)) { init(); for(int i=1; i<=n; i++) scanf("%d",&v[i]); build(1,1,n+1); while(m--) { scanf("%d%d",&x,&y); small=INT_MAX; big=0; get(1,x,y+1); printf("%d\n",big-small); } } return 0; }
相关文章推荐
- POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】
- poj 2823 Sliding Window (线段树 求固定区间的最大最小值 )
- 线段树--数据结构(建树,查询区间和&&最大值&&最小值)
- NYOJ 1185 最大最小值 (线段树 & 区间最值查询)
- POJ 3264(线段树求区间内最大值和最小值)
- POJ 3264 Balanced Lineup 线段树求区间最大最小(普通线段树,ZKW线段树)
- 线段树求区间最大值和最小值(指针)
- Uva 11992 - Fast Matrix Operations题解(线段树区间更新+区间Set+Add,查询最大值,最小值,总和)
- 线段树(区间和,最大值,最小值,区间动态更新查询)
- 模板:线段树求区间最大/最小值及下标
- POJ3264(线段树求区间最大值和最小值)
- 线段树区间更新,区间求和,最大值,最小值模板
- 线段树区间修改 懒惰标记 维护和、最大值、最小值
- 线段树之区间最大连续和问题
- hdu 1754 线段树区间最大值 单点更新
- 线段树模板(区间和最大值最下值)
- HDU1754线段树求取区间最大值
- 线段树维护区间最大连续和
- hdu1754-线段树(求区间最大值)
- hdu 1754 I Hate It (线段树--求区间最大值)(基础)