⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex1.dpr

📁 tongji acm-online judge solution
💻 DPR
字号:
(*
Heap
First thought:
1.Keep exact |M| in heap for every check 
2.and output Max in heap for every check 
but because in step 1, item that is deleted  may be not Max
that is wrong for heap operation
Second thought:
1.push New Value for every check 
2.output Max that index of Max is in [i-M+1,i] in heap
in step 2, if Max is not in  [i-M+1,i] (namely index of Max<=i,this Max is disable) then delete it until find Max in [i-M+1,i]

*)
program Ural_1126(Input, Output);
//0.046 569 kb
const
    MaxN = 25000;
    Buffer = 2;
type
    TIndex = Longint;
    TData = Longint;
    TNode = record
        Ind: TIndex;
        Value: TData;
    end;
    TQueue = array[1..MaxN + Buffer] of TNode;
var
    N, M, Len: TIndex;
    Q: TQueue;

procedure InsertNode(tmp: TNode);
var
    i: TIndex;
begin
    Inc(Len);
    i := Len;
    while i > 1 do
        if tmp.Value > Q[i div 2].Value then
        begin
            Q[i] := Q[i div 2];
            i := i div 2;
        end
        else
            Break;
    Q[i] := tmp;
end;

procedure DeleteMax;
var
    i, j: TIndex;
    tmp: TNode;
begin
    tmp := Q[Len];
    Dec(Len);
    i := 1;
    while i * 2 <= Len do
    begin
        j := i * 2;
        if (j + 1 <= Len) and (Q[j].Value < Q[j + 1].Value) then Inc(j);
        if tmp.Value < Q[j].Value then
        begin
            Q[i] := Q[j];
            i := j;
        end
        else
            Break;
    end;
    Q[i] := tmp;
end;

function Maximum: TNode;
begin
Maximum := Q[1];
end;     

procedure Main;
var
    T: TData;
    NewN: TNode;
begin
    FillChar(Q, SizeOf(Q), 0);
    Readln(M);
    Len := 0;
    N := 0;
    repeat
        Readln(T);
        if T = -1 then Break;
        Inc(N);
        NewN.Ind := N;
        NewN.Value := T;
        InsertNode(NewN);
        if N >= M then
        begin
            while Maximum.Ind < N - M + 1 do
                DeleteMax;
            Writeln(Maximum.Value);
        end;
    until false;
end;
begin
    {     Assign(Input, 'i.txt');
          Reset(Input);
          Assign(Output, 'o.txt');
          Rewrite(Output);   }
    Main;
    { Close(Input);
      Close(Output);}
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -