题意: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; }