堆模板(pascal)洛谷P3378

2022-05-31 08:36:09 字數 2007 閱讀 7332

如題,初始小根堆為空,我們需要支援以下3種操作:

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

操作2: 2 輸出該小根堆內的最小數

操作3: 3 刪除該小根堆內的最小數

輸入格式:

第一行包含乙個整數n,表示操作的個數

接下來n行,每行包含1個或2個正整數,表示三種操作,格式如下:

操作1: 1 x

操作2: 2

操作3: 3

輸出格式:

包含若干行正整數,每行依次對應乙個操作2的結果。

輸入樣例#1:

5

1 21 523

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);

2var

3 a:array[0..1000010]of

longint;

4n,opt,i,m,t,k,x:longint;

5procedure

ins;

6begin

7 inc(m);a[m]:=x;k:=m;

8while (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;

10procedure

del;

11begin

12 a[1]:=a[m];dec(m);k:=1;13

while true do

14begin

15if k+k>m then

exit;

16if k+k=m then

17begin

18if a[k+k]then

begin t:=a[k+k];a[k+k]:=a[k];a[k]:=t; end;19

break;

20end;21

if (a[k+k]>=a[k]) and (a[k+k+1]>=a[k]) then

break;

22if a[k+k]1] then

23begin t:=a[k+k];a[k+k]:=a[k];a[k]:=t;k:=k+k; end

24else

begin t:=a[k+k+1];a[k+k+1]:=a[k];a[k]:=t;k:=k+k+1; end;25

end;

26end;27

begin

28 assign(input,'

r.in

');assign(output,'

r.out

');reset(input);rewrite(output);

29readln(n);

30 m:=0;31

for i:=1

to n do

32begin

33read(opt);

34if opt=1

then

begin read(x);ins; end

35else

if opt=2

then writeln(a[1

])36

else

del;

37end;38

close(input);close(output);

39end.

洛谷P3378 模板 堆

洛谷p3378 輸入樣例 51 2152 32輸出樣例 25ac include using namespace std const int maxn 1e6 5 int heap maxn int ind 0 void insertheap 自下向上調整堆,因為除新加的結點外符合小根堆定義 ret...

洛谷 P3378 模板 堆

如題,初始小根堆為空,我們需要支援以下3種操作 操作1 1 x 表示將x插入到堆中 操作2 2 輸出該小根堆內的最小數 操作3 3 刪除該小根堆內的最小數 輸入格式 第一行包含乙個整數n,表示操作的個數 接下來n行,每行包含1個或2個正整數,表示三種操作,格式如下 操作1 1 x 操作2 2 操作3...

洛谷 P3378 模板 堆

然後稍微科普一下stl哦 在queue裡面有乙個叫做priority queue 優先佇列 初始化狀態為大根堆,經過這樣的操作可以變為小根堆 priority queue greater q 需要注意的是在greater 該括號與後面那個括號不能夠連在一起,否則會報錯,因為 或者可以不這樣做,直接用...