堆模板(pascal)洛谷P3378

题目描述

如题,初始小根堆为空,我们需要支持以下3种操作:

操作1: 1 x 表示将x插入到堆中

操作2: 2 输出该小根堆内的最小数

操作3: 3 删除该小根堆内的最小数

输入输出格式

输入格式:

第一行包含一个整数N,表示操作的个数

接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下:

操作1: 1 x

操作2: 2

操作3: 3

 

输出格式:

包含若干行正整数,每行依次对应一个操作2的结果。

 

输入输出样例

输入样例#1:
5
1 2
1 5
2
3
2
输出样例#1:
2
5

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=15

对于70%的数据:N<=10000

对于100%的数据:N<=1000000(注意是6个0。。。不过不要害怕,经过编者实测,堆是可以AC的)

样例说明:

故输出为2、5

 

 

明天市赛,继续复习板子。

代码丑勿喷。

 1 program rrr(input,output);
 2 var
 3   a:array[0..1000010]of longint;
 4   n,opt,i,m,t,k,x:longint;
 5 procedure ins;
 6 begin
 7    inc(m);a[m]:=x;k:=m;
 8    while (k>1) and (a[k>>1]>a[k]) do begin t:=a[k>>1];a[k>>1]:=a[k];a[k]:=t;k:=k>>1; end;
 9 end;
10 procedure del;
11 begin
12    a[1]:=a[m];dec(m);k:=1;
13    while true do
14       begin
15          if k+k>m then exit;
16          if k+k=m then
17             begin
18                if a[k+k]<a[k] then begin t:=a[k+k];a[k+k]:=a[k];a[k]:=t; end;
19                break;
20             end;
21          if (a[k+k]>=a[k]) and (a[k+k+1]>=a[k]) then break;
22          if a[k+k]<a[k+k+1] then
23             begin t:=a[k+k];a[k+k]:=a[k];a[k]:=t;k:=k+k; end
24         else begin t:=a[k+k+1];a[k+k+1]:=a[k];a[k]:=t;k:=k+k+1; end;
25       end;
26 end;
27 begin
28    assign(input,'r.in');assign(output,'r.out');reset(input);rewrite(output);
29    readln(n);
30    m:=0;
31    for i:=1 to n do
32       begin
33          read(opt);
34          if opt=1 then begin read(x);ins; end
35          else if opt=2 then writeln(a[1])
36          else del;
37       end;
38    close(input);close(output);
39 end.

 

posted @ 2017-03-17 22:54  Klaier  阅读(251)  评论(0编辑  收藏  举报