<题目链接>
题目大意:
求给定区间内最大值与最小值之差。
解题分析:
线段树水题,每个节点维护两个值,分别代表该区间的最大和最小值即可。
#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\n",mx-mn); } } return 0; }
2018-09-23
原文地址:https://www.cnblogs.com/00isok/p/9692914.html
时间: 2024-10-19 19:15:39