堆模板(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.
时间: 2024-10-09 20:00:51

堆模板(pascal)洛谷P3378的相关文章

网络流最大流模板(洛谷3376)——Dinic

小道消息,据说NOIP 2017 的六个题是三位(前?)国家队大神出的,所以难度很有可能贼高,并且可能出现网络流,所以慌慌张张地来打了个Dinic 模板,但愿汝佳所说“在大多数比赛中已经完全够用了”是对的. 1 #include<queue> 2 #include<vector> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstring> 6 #include<cstdlib

树链剖分[模板](洛谷 P3384)

洛谷·[模板]树链剖分 写在前面 首先,在学树链剖分之前最好先把 LCA.树形DP.DFS序 这三个知识点学了 如果这三个知识点没掌握好的话,树链剖分难以理解也是当然的. 树链剖分 树链剖分 就是对一棵树分成几条链,把树形变为线性,减少处理难度 概念 dfs1() dfs2() 对剖过后的树建线段树 处理问题 概念 重儿子:对于每一个非叶子节点,它的儿子中 儿子数量最多的那一个儿子 为该节点的重儿子 轻儿子:对于每一个非叶子节点,它的儿子中 非重儿子 的剩下所有儿子即为轻儿子 叶子节点没有重儿子

洛谷 P3378 【模板】堆x

我终于会堆!了! 题目描述 如题,初始小根堆为空,我们需要支持以下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 输出样例#

堆的模板题【洛谷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 1 #includ

堆or优先队列(洛谷1801 黑匣子_NOI导刊2010提高(06))

Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ADD(x):把x元素放进BlackBox; GET:i加1,然后输出Blackhox中第i小的数. 记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素.例如: 我们来演示一下一个有11个命令的命令串.(如下图所示) 现在要求找出对于给定的命令串的最好的处理方法.ADD和GET

【三分模板】洛谷P3382三分模板

题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次包含一个正整数N和两个实数l.r,含义如题目描述所示. 第二行包含N+1个实数,从高到低依次表示该N次函数各项的系数. 输出格式: 输出为一行,包含一个实数,即为x的值.四舍五入保留5位小数. 输入输出样例 输入样例#1: 3 -0.9981 0.5 1 -3 -3 1 输出样例#1: -0.41421 说明 时空限制:50ms,12

【树状数组区间加+区间查询模板】洛谷P3372

虽然说这道题线段树很好做,但毕竟树状数组常数小又好写,所以还是写个模板吧. 区间加转为前缀加 区间和转为前缀和 我们讨论一个1~k的区间加x对于一个前缀和val[i]的影响 对于所有k<i的更新,对val[i]的贡献为val[i]+=k*x 对于所有k>=i的更新,对val[i]的贡献为val[i]+=i*x 所以我们维护记录两个数组,对于每次更新 a[k]+=x;b[k]+=k*x; 所以对于一个值的前缀和val[i]=b[1~i]+(a[i+1]~a[now])*i; 然后询问的时候前缀减

扩展欧几里得模板(洛谷1082 同余方程NOIP 2012 提高组 第二天 第一题)

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 100%的数据,2 ≤a, b≤ 2,000,000,000

并查集模板(洛谷——【模板】并查集)

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=10010; int fa[maxn],n,m; void init(){ for(int i=1;i<=n;i++)fa[i]=i; } int find(int x){ if(fa[x]==x)return x; return fa