POJ 3264 Balanced Lineup 线段树
Posted 00isok
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3264 Balanced Lineup 线段树相关的知识,希望对你有一定的参考价值。
<题目链接>
题目大意:
求给定区间内最大值与最小值之差。
解题分析:
线段树水题,每个节点维护两个值,分别代表该区间的最大和最小值即可。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define Lson rt<<1,l,mid #define Rson rt<<1|1,mid+1,r #define INF 0x3f3f3f3f const int N =50000+5; int n,m; int a[N]; struct Tree{ int mn,mx; }tr[N<<2]; void Pushup(int rt){ tr[rt].mx=max(tr[rt<<1].mx,tr[rt<<1|1].mx); tr[rt].mn=min(tr[rt<<1].mn,tr[rt<<1|1].mn); } void build(int rt,int l,int r){ if(l==r){ tr[rt].mn=tr[rt].mx=a[l]; return; } int mid=(l+r)>>1; build(Lson); build(Rson); Pushup(rt); } int query(int rt,int l,int r,int L,int R,int c){ if(L<=l&&r<=R){ if(!c)return tr[rt].mn; else return tr[rt].mx; } int mid=(l+r)>>1; int mxval=-INF,mnval=INF; if(L<=mid){ if(!c)mnval=min(mnval,query(Lson,L,R,c)); //注意这里最大和最小都是向左儿子递归 else mxval=max(mxval,query(Lson,L,R,c)); } if(R>mid){ if(!c)mnval=min(mnval,query(Rson,L,R,c)); else mxval=max(mxval,query(Rson,L,R,c)); } if(!c)return mnval; else return mxval; } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } build(1,1,n); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); int mx=query(1,1,n,u,v,1); int mn=query(1,1,n,u,v,0); printf("%d ",mx-mn); } } return 0; }
2018-09-23
以上是关于POJ 3264 Balanced Lineup 线段树的主要内容,如果未能解决你的问题,请参考以下文章