MY*****

poj 2823 window

分析:经典的队列应用,实现N的最大最小查找。

var
  a,q:array[0..1000000] of longint;
  i,j,head,tail,n,m:longint;

begin
  readln(n,m);
  for i:=1 to n do read(a[i]);
  head:=1; tail:=1; q[1]:=1;
  for i:=2 to m-1 do
    begin
      while (head<=tail)and(a[q[tail]]>=a[i]) do dec(tail);
      inc(tail);
      q[tail]:=i;
    end;
  for i:=m to n do
    begin
      while (head<=tail)and(q[head]<=i-m) do inc(head);
      while (head<=tail)and(a[q[tail]]>=a[i]) do dec(tail);
      inc(tail);
      q[tail]:=i;
      write(a[q[head]],' ');
    end;
  writeln;
  head:=1; tail:=1; q[1]:=1;
  for i:=2 to m-1 do
    begin
      while (head<=tail)and(a[q[tail]]<=a[i]) do dec(tail);
      inc(tail);
      q[tail]:=i;
    end;
  for i:=m to n do
    begin
      while (head<=tail)and(q[head]<=i-m) do inc(head);
      while (head<=tail)and(a[q[tail]]<=a[i]) do dec(tail);
      inc(tail);
      q[tail]:=i;
      write(a[q[head]],' ');
    end;
  writeln;
end.

  

posted on 2011-10-20 07:46  reflec94  阅读(966)  评论(0编辑  收藏  举报

导航