【RMQ&LCA】运动员的身高
Time Limit:1000MS
Total Submit:12 Accepted:7
Description
运动员的身高(hl.pas/c/cpp)
【问题描述】
激动人心的2012伦敦奥运会结束了,某国奥运代表团决定要拍一个奥运代表团的合照,为了让每一个人都能出现在第一行的位置,参与合照的运动员都排成一排,照片拍出来后,一个有趣的问题就提出来了,由于运动员之间在拍照的时候并没有按身高进行排列,所以照片中的运动员身高都参差不齐,现在想知道照片中的某两个位置之间所有运动员最高身高的人与最低身高的人身高之差是多少,请你帮忙求出来。
Input
输入第一行是两个数n,m(0< n,m≤10000)表示照片中有n个运动员,第二行有n个数表示照片中从左到右排列的运动员的身高(都是以厘米为单位的整数)。
第3行开始到m+3行,每行两个数ai,bi,表示一个询问,在照片中从左往右第ai个运动员和第bi个运动员之间最高最低身高差是多少。
Output
输出一共m行,每行对应上面的一个询问,两个位置的运动员之间身高最大差是多少。
Sample Input
10 5 1 5 7 3 2 4 5 7 3 1 1 3 4 7 2 9 1 10 5 8
Sample Output
6 3 5 6 5
Source
本站原创
用ST算法,来求一个区间[a,b]中的最大值和最小值。
w[i]表示输入的数组
先做预处理,设mi[b,t]表示 b 至 b+2^t-1 中的最值。
mi[b,t]:=min(mi[b,t-1],mi[b+2^(t-1),t-1]);
mi[b,0]:=w[b];
t可用 trunc(ln(n)/ln(2))
var
function min(x,y:longint):longint;
begin
end;
function max(x,y:longint):longint;
begin
end;
procedure work;
var
begin
end;
begin
end.