Window_纪中_1326
题目大意
给你一个度为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.