P3378 堆の模板
如果不是可并堆/带修堆/卡常题,一般都用优先队列实现。
很多O(nlogn)过不了的题都可以用蚯蚓的套路来实现!!!
优先队列带修用延迟删除法。
堆,可以简单的用优先队列来实现,也可以自己手打。
#include <cstdio>
#include <algorithm>
using namespace std; const int N = ;
long long int heap[*N+],top;
void down(int);
void up(int a)
{
while(heap[a]<heap[a>>] && a!=) swap(heap[a],heap[a>>]),a=a>>;
down(a);
return;
}
void down(int a)
{
if((a<<)>top) return;///这里的括号不能省;这里的等号不能加。调了一个中午的教训啊
if((a<<)==top)
{
if(heap[a]>heap[top]) swap(heap[a],heap[top]);
return;
}
if(heap[a]<=heap[a<<] && heap[a]<=heap[a<<|]) return;
if(heap[a]<heap[a<<])
{
swap(heap[a],heap[a<<|]);
down(a<<|);
return;
}
if(heap[a]<heap[a<<|])
{
swap(heap[a],heap[a<<]);
down(a<<);
return;
}
if(heap[a<<]<heap[a<<|])
{
swap(heap[a],heap[a<<]);
down(a<<);
return;
}
else
{
swap(heap[a],heap[a<<|]);
down(a<<|);
return;
}
}
void add(int a)
{
heap[++top]=a;
up(top);
return;
}
void del()
{
swap(heap[],heap[top]);
top--;
if(top<=) return;
down();
return;
}
int main()
{
int n;
scanf ("%d",&n);
int flag,x;
for(int i=;i<=n;i++)
{
scanf ("%d",&flag); if(flag==) printf("%d\n",heap[]);
else if(flag==) del();
else scanf ("%d",&x),add(x);
} return ;
}
模板在此!!!
想不到居然写了70行......
之前写的跟屎一样......
最新模板在此:
#include <cstdio>
#include <algorithm>
using std::swap;
typedef long long LL;
const int N = ; struct SmallHeap {
LL h[N];
int top;
SmallHeap() {
top = ;
}
inline void up(int p) {
while(p != && h[p] < h[p >> ]) {
swap(h[p], h[p >> ]);
p = p >> ;
}
return;
}
inline void down(int p) {
int s = p << ;
while(s <= top) {
if(s < top && h[s] > h[s | ]) {
s = s | ;
}
if(h[s] < h[p]) {
swap(h[s], h[p]);
p = s;
s = p << ;
}
else break;
}
return;
}
inline void insert(LL a) {
h[++top] = a;
up(top);
return;
}
inline void del(int p) {
h[p] = h[top--];
up(p);
down(p);
return;
}
inline LL gettop() {
return h[];
}
inline void pop() {
h[] = h[top--];
down();
return;
}
}heap; int main() {
LL n, x;
scanf("%lld", &n);
for(int i = ; i <= n; i++) {
scanf("%lld", &x);
heap.insert(x);
}
LL ans = ;
for(int i = ; i < n; i++) {
LL temp = heap.gettop();
heap.pop();
temp += heap.gettop();
heap.pop();
ans += temp;
heap.insert(temp);
}
printf("%lld", ans);
return ;
}
小根堆
P3378 堆の模板的更多相关文章
- 洛谷P3378 【模板】堆
P3378 [模板]堆 160通过 275提交 题目提供者HansBug 标签 难度普及- 提交 讨论 题解 最新讨论 经实际测试 堆的数组开3000- 题目有个问题 为什么这个按课本堆标准打的- ...
- P3378 【模板】堆 (内含左偏树实现)
P3378 [模板]堆 题解 其实就是一个小根堆啦,STL就可以解决,但是拥有闲情雅致的我学习了Jelly_Goat的左偏树,增加了代码长度,妙啊 Solution 1 STL STL 里面prior ...
- P3378 堆(模板)
P3378 [模板]堆 题目描述 给定一个数列,初始为空,请支持下面三种操作: 给定一个整数 x,请将 x 加入到数列中. 输出数列中最小的数. 删除数列中最小的数(如果有多个数最小,只删除 1 个) ...
- 可并堆模板题-mergeable heap
Description 有n个点,第i个点标号为i,有两种操作:0 x y 表示把x所在堆和y所在堆合并.1 x 表示询问x所在堆的最小权. Input 第一行两个整数n,m,表示有n个点m个操作. ...
- 【luogu P3378 堆】 模板
题目链接:https://www.luogu.org/problemnew/show/P3378 是堆的模板...我懒,STL da fa is good #include <iostream& ...
- Luogu P3378 【模板】堆
((^ 0.0 ^) )~ 堆是一个完全二叉树,对于小根堆,所有父节点<=子节点,下标就和线段树是一样的 在STL里就是优先队列 只有堆顶元素可以操作(询问或弹出). 加入新元素时x,he ...
- 堆模板(pascal)洛谷P3378
题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: ...
- 洛谷 P3378 【模板】堆
如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: 第一行包含 ...
- P3378 堆【模板】 洛谷
https://www.luogu.org/problem/show?pid=3378 题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 ...
随机推荐
- 使用cmd命令删除文件夹下所有文件
rmdir 删除整个目录 好比说我要删除 222 这个目录下的所有目录和档案,这语法就是: rmdir /s/q 222 其中: /s 是代表删除所有子目录跟其中的档案. /q 是不要它在删除档案或目 ...
- C# Note22: 《Effective C#》笔记
参考:<Effective C#>快速笔记(一)- C# 语言习惯 参考:<Effective C#>快速笔记(二)- .NET 资源托管 参考:<Effective C ...
- switch-case和if-else可互换时
当switch-case和if-else可互换时,应当优先采用switch-case.因为switch-case的效率更高(详情下回分解).
- C程序运行时的内存分布
该篇博客是自己学习的总结,如果有哪里理解的不对的地方,希望大家可以指点. 一.C内存空间分布图 二.各内存区域详解 1.代码区(.text): 该区域主要存放二进制可执行文件. 2.数据区(.data ...
- socket基础编程-1
server端和client端 1.server端: import socket server=socket.socket() server.bind(('localhost',8080)) serv ...
- git 提交顺序
0. git branch # 查看自己是哪个分支:先确定自己现在是哪个分支 1. git fetch # 将远程主机的更新,全部取回本地.如果只想取回特定分支的更新,可以指定分支名:git ...
- How to enable usb on vbox
Device-->Install Guest Addition Shared Folders Settings-->Advanced-->Shared Clipboard--> ...
- mysql语句-DML语句
DML语句 DML是指对数据库中表记录的操作,主要包括数据的增删改查以及更新,下面依次介绍 首先创建一张表:: 表名:emp 字段:ename varchar(20),hiredate date ,s ...
- 网页调起QQ聊天
将QQ账号换成正常的QQ号即可,要确保这个QQ支持临时会话 <a href="http://wpa.qq.com/msgrd?v=3&uin=QQ账号&site=qq& ...
- MySQL 同一台服务器同步数据
声明:我配置出来的slave_io_running和slave_sql_running都是yes.但是数据并没有同步! 希望有遇到相同问题的朋友,能够告诉我一下解决方案? 首先,如何在同一个服务器安装 ...