题意:Farmer John有n头牛按照编号顺序排好,第i头牛高度为hei[i],现在给出区间[a,b],问这个区间内的最高的牛和最低的牛相差多高。
思路:基础线段树。 静态建树,求区间最大值与最小值之差。跑得要点慢。
代码如下:
#include<iostream>
using namespace std;
const int Max = 50005;
struct
{
int l, r, max, min;
}node[3*Max];
int hei[Max], ma, mi;
int max1(int a, int b)
{
return a > b ? a : b;
}
int min1(int a, int b)
{
return a < b ? a : b;
}
void BuildTree(int left, int right, int u)
{ // 建树。
node[u].l = left;
node[u].r = right;
if(left == right)
{
node[u].max = node[u].min = hei[left];
return;
}
BuildTree(left, (left+right)>>1, u<<1);
BuildTree(((left+right)>>1)+1, right, (u<<1)+1);
node[u].max = max1(node[u<<1].max, node[(u<<1)+1].max);
node[u].min = min1(node[u<<1].min, node[(u<<1)+1].min);
}
void query(int left, int right, int u)
{ // 查询。
if(node[u].l == left && node[u].r == right)
{
ma = max1(ma, node[u].max);
mi = min1(mi, node[u].min);
return;
}
if(left <= node[u<<1].r)
{
int r = min1(right, node[u<<1].r);
query(left, r, u<<1);
}
if(right >= node[(u<<1)+1].l)
{
int l = max1(left, node[(u<<1)+1].l);
query(l, right, (u<<1)+1);
}
}
int main()
{
int n, m, i;
scanf("%d%d", &n, &m);
for(i = 1; i <= n; i ++)
scanf("%d", &hei[i]);
BuildTree(1, n, 1);
while(m--)
{
int a, b;
scanf("%d%d", &a, &b);
ma = 0;
mi = 1000000;
query(a, b, 1);
cout << ma - mi << endl;
}
return 0;
}