题目链接:https://vjudge.net/problem/POJ-3264
题意:线段树简单应用题,区间查询最大值和最小值的差。
思路:用线段树维护区间的最大值和最小值即可。
AC代码:
#include<cstdio> #include<algorithm> using namespace std; const int maxn=50005; struct node{ int l,r,Max,Min; }tr[maxn<<2]; int n,Q,a[maxn],ans1,ans2; void build(int v,int l,int r){ tr[v].l=l,tr[v].r=r; if(l==r){ tr[v].Max=tr[v].Min=a[l]; return; } int mid=(tr[v].l+tr[v].r)>>1; build(v<<1,l,mid); build(v<<1|1,mid+1,r); tr[v].Max=max(tr[v<<1].Max,tr[v<<1|1].Max); tr[v].Min=min(tr[v<<1].Min,tr[v<<1|1].Min); } void query(int v,int l,int r){ if(l<=tr[v].l&&r>=tr[v].r){ ans1=max(ans1,tr[v].Max); ans2=min(ans2,tr[v].Min); return; } int mid=(tr[v].l+tr[v].r)>>1; if(l<=mid) query(v<<1,l,r); if(r>mid) query(v<<1|1,l,r); } int main(){ scanf("%d%d",&n,&Q); for(int i=1;i<=n;++i) scanf("%d",&a[i]); build(1,1,n); while(Q--){ int a,b; scanf("%d%d",&a,&b); ans1=0,ans2=0x3f3f3f3f; query(1,a,b); printf("%d ",ans1-ans2); } return 0; }