题目大意
给你一个度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表:
你的任务是找出窗口在各位置时的max value,min value.
分析
水的要死啊!!!
但是我们一开始用了并查集!!!
就爆内存了。
其实只用枚举暴力。
代码
var
a:array[1..2000000] of longint;
ma,mi:array[1..2000000] of longint;
i,j,k:longint;
n,m:longint;
max,min:longint;
tmax,tmin:longint;
procedure max_(r,l:longint);
var
i,j,k:longint;
begin
max:=-maxlongint;
tmax:=0;
for i:=r to l do
if a[i]>max
then
begin
max:=a[i];
tmax:=i;
end;
end;
procedure min_(r,l:longint);
var
i,j,k:longint;
begin
min:=maxlongint;
tmin:=0;
for i:=r to l do
if a[i]<min
then
begin
min:=a[i];
tmin:=i;
end;
end;
begin
readln(n,m);
for i:=1 to n do
read(a[i]);
max_(1,m);
min_(1,m);
ma[1]:=max;
mi[1]:=min;
for i:=2 to n-m+1 do
begin
k:=i+m-1;
if tmax>=i
then
if a[k]>max
then
begin
max:=a[k];
tmax:=k;
end;
if tmax<i then max_(i,k);
ma[i]:=max;
if tmin>=i
then
if a[k]<min
then
begin
min:=a[k];
tmin:=k;
end;
if tmin<i then min_(i,k);
mi[i]:=min;
end;
for i:=1 to n-m+1 do
write(mi[i],' ');
writeln;
for i:=1 to n-m+1 do
write(ma[i],' ');
end.