题意:
给出每个位置奶牛高度,求出l,r这个区间段最高牛和最低的牛的差值
思路:
线段树维护最值
#include <stdio.h> #include <algorithm> #include <cstring> #include <iostream> using namespace std; const int maxn= 50005; const int inf=0x3f3f3f3f; int a[maxn]; struct node { int left,right,maxx,minn,num; }tree[4*maxn]; void Build(int i,int left,int right) { tree[i].left=left,tree[i].right=right; if(left==right) { tree[i].num=a[ tree[i].left ]; tree[i].minn=tree[i].num; tree[i].maxx=tree[i].num; return ; } int mid=(tree[i].left+tree[i].right)>>1; Build(i<<1,left,mid); Build(i<<1|1,mid+1,right); tree[i].minn=min(tree[i<<1].minn,tree[i<<1|1].minn); tree[i].maxx=max(tree[i<<1].maxx,tree[i<<1|1].maxx); return ; } int ansmax,ansmin; void query(int i,int left,int right) { if(tree[i].right==right&&tree[i].left==left) { ansmax=max(ansmax,tree[i].maxx); ansmin=min(ansmin,tree[i].minn); return ; } int mid=(tree[i].left+tree[i].right)>>1; if(left>mid) { query(i<<1|1,left,right); } else if(right<=mid) { query(i<<1,left,right); } else { query(i<<1,left,mid); query(i<<1|1,mid+1,right); } return ; } int main() { int n,q; scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) scanf("%d",&a[i]); Build(1,1,n); while(q--) { int l,r; scanf("%d%d",&l,&r); ansmax=0,ansmin=inf; query(1,l,r); printf("%d\n",ansmax-ansmin); } }