Balanced Lineup——区间最大值区间最小值
Posted j666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Balanced Lineup——区间最大值区间最小值相关的知识,希望对你有一定的参考价值。
题意:
给定n个数,q次询问,查询当前区间最大值与最小值的差值
题解:
线段树模板题
区间查询最大值、最小值
代码:
#include<iostream> #include<stdio.h> #include<math.h> #include<algorithm> #include<vector> #include<map> using namespace std; typedef long long ll; const int maxn=1e5+5; struct node int l,r; int minn,maxx; tree[maxn<<2]; int n,a[maxn],q; void push_up(int x) tree[x].maxx=max(tree[x<<1].maxx,tree[x<<1|1].maxx); tree[x].minn=min(tree[x<<1].minn,tree[x<<1|1].minn); void build(int x,int l,int r) tree[x].l=l,tree[x].r=r; if(l==r) tree[x].maxx=tree[x].minn=a[l]; else int mid=(l+r)>>1; build(x<<1,l,mid); build(x<<1|1,mid+1,r); push_up(x); ll query(int x,int l,int r,int flag) int L=tree[x].l,R=tree[x].r; if(l<=L && R<=r) if(flag)return tree[x].maxx; else return tree[x].minn; else if(flag) ll ans=0; int mid=(L+R)>>1; if(mid>=l)ans=max(ans,query(x<<1,l,r,flag)); if(mid<r)ans=max(ans,query(x<<1|1,l,r,flag)); push_up(x); return ans; else ll ans=0x3f3f3f3f; int mid=(L+R)>>1; if(mid>=l)ans=min(ans,query(x<<1,l,r,flag)); if(mid<r)ans=min(ans,query(x<<1|1,l,r,flag)); push_up(x); return ans; int main() scanf("%d%d",&n,&q); for(int i=1; i<=n; i++) scanf("%d",&a[i]); build(1,1,n); for(int i=1; i<=q; i++) int l,r; scanf("%d%d",&l,&r); ll ans=query(1,l,r,1)-query(1,l,r,0); printf("%lld\n",ans); return 0;
以上是关于Balanced Lineup——区间最大值区间最小值的主要内容,如果未能解决你的问题,请参考以下文章
POJ3264 Balanced Lineup 线段树区间最大值 最小值
POJ 3264 Balanced Lineup线段树区间查询求最大值和最小值
P2880 [USACO07JAN]平衡的阵容Balanced Lineup(RMQ的倍增模板)
POJ - 3264 Balanced Lineup (RMQ问题求区间最值)