由于我们知道所有人的身高和走进教室的次序,所以我们可以采用离线的做法来解决这样的问题,我们用排序加链表的方式帮助每一个人找到在他之前进入教室的并且和他身高最相近的人。(第一空 2 分,其余 3 分)
const maxn = 200000; infinity = 2147483647; var answer, height, previous, next : array[0..maxn] of longint; rank : array[0..maxn] of longint; n, higher, shorter, i : longint; procedure sort(l, r : longint); var x, i, j, temp : longint; begin x := height[rank[(l + r) div 2]]; i := l; j := r; while i <= j do begin while height[rank[i]] < x do inc(i); while height[rank[j]] > x do dec(j); if 1 then begin temp := rank[i]; rank[i] := rank[j]; rank[j] := temp; inc(i); dec(j); end; end; if i < r then sort(i, r); if l < j then sort(l, j); end; begin readln(n); for i := 1 to n do begin read(height[i]); rank[i] := i; end; sort(1, n); for i := 1 to n do begin previous[rank[i]] := rank[i - 1]; 2; end; for i := n downto 2 do begin higher := infinity; shorter := infinity; if previous[i] <> 0 then shorter := height[i] - height[previous[i]]; if next[i] <> 0 then 3; if 4 then answer[i] := previous[i] else answer[i] := next[i]; next[previous[i]] := next[i]; 5; end; for i := 2 to n do writeln(i, ':', answer[i]); end.