题目大意:
一个含有n项的数列,求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。
m≤n≤2000000
题解:
这题就是一道单调队列的模板,
不过每次到第i个时求的是[i-m,i-1]的最小值,所以不要到i,然后就套单调队列。
单调队列不会的可以去看一下我的另一篇博文。
http://blog.csdn.net/gx_man_vip/article/details/78554177
时间复杂度:O(n)
var
a,min:Array [0..2000001] of longint;
i,n,m,phead,qtail:longint;
begin
readln(n,m);
phead:=1; qtail:=0;
for i:=1 to n do
begin
read(a[i]);
if (min[phead]<i-m) then inc(phead);
while (phead<=qtail) and (a[i]<a[min[qtail]]) do dec(qtail);
writeln(a[min[phead]]);
qtail:=qtail+1;
min[qtail]:=i;
end;
end.