给出n个牛的高度,然后询问所给区间内牛的最大高度差是多少?
这题比较简单一点是不用更新,每次只是询问,那么可以直接用两个变量mmax,mmin来保存查找过程中的最大与最小高度值,两个差即可
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <climits>
#define L(x) (x << 1)
#define R(x) (x << 1 | 1)
using namespace std;
const int MAX = 50010;
struct Tnode{ int mmax,mmin,val; int l,r;};
Tnode node[MAX*3];
int v[MAX],big,small;
void init()
{
memset(node,0,sizeof(node));
}
void build(int t,int l,int r)
{
node[t].l = l;
node[t].r = r;
if(l==r-1)
{
node[t].mmin=v[l];
node[t].mmax=v[l];
//node[t].val = v[l];
return ;
}
int mid = ( l + r ) >> 1;
build(L(t), l, mid);
build(R(t), mid, r);
node[t].mmax=max(node[L(t)].mmax,node[R(t)].mmax);
node[t].mmin=min(node[L(t)].mmin,node[R(t)].mmin);
}
void get(int t,int l,int r)
{
if( node[t].l == l && node[t].r ==r )
{
big=max(node[t].mmax,big);
small=min(node[t].mmin,small);
return ;
}
int mid = (node[t].l + node[t].r) >> 1;
if( l >= mid )
get(R(t),l,r);
else if( r <= mid )
get(L(t),l,r);
else
{
get(R(t),mid,r);
get(L(t),l,mid);
}
}
int main()
{
int n,m,x,y;
while( ~scanf("%d%d",&n,&m) )
{
init();
for(int i=1; i<=n; i++)
scanf("%d",&v[i]);
build(1,1,n+1);
while( m-- )
{
scanf("%d%d",&x,&y);
small = INT_MAX; big = 0;
get(1,x,y+1);
printf("%d\n",big - small);
}
}
return 0;
}

浙公网安备 33010602011771号