ACM模板——堆操作集合

简介: ACM模板——堆操作集合

手写版:

/* 以下为 min heap 为例 */#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define ssclr(ss) ss.clear(), ss.str("")#define INF 0x3f3f3f3f#define MOD 1000000007usingnamespacestd;
typedeflonglongll;
constintmaxn=1e4+10;
inta[maxn], b[maxn], len, k;
voidshift_up(inti)
{
while((i>>1)>=1)
    {
if(a[i]<a[i>>1]) swap(a[i],a[i>>1]);
elsereturn;
i>>=1;
    }
}
voidshift_down(inti)
{
intt;
while((i<<1)<=len)
    {
t=i<<1;
if(t<len&&a[t]>a[t+1]) t++;
if(a[t]<a[i]) swap(a[t],a[i]);
elsereturn;
i=t;
    }
}
voidheap_push(intnum)
{
a[++len]=num;
shift_up(len);
}
voidheap_build()
{
inti, f, l, r, p, cid;
while(1)
    {
f=0, i=len;
while((i>>1)>=1)
        {
p=i>>1, l=p<<1, cid=l;
if(l+1<=len)
            {
r=l+1;
if(a[r]<a[l]) cid=r;
            }
if(a[cid]<a[p]) f=1, swap(a[cid],a[p]);
i=(p-1)<<1;
        }
if(!f) return;
    }
}
voidheap_pop()
{
swap(a[1],a[len]);
len--;
shift_down(1);
}
intheap_top()
{
returnlen==0?-INF : a[1];
}
boolheap_empty()
{
return!len;
}
voidheap_sort()
{
k=0;
while(len>0)
    {
b[k++]=heap_top();
heap_pop();
    }
}
intmain()
{
intn,num;
scanf("%d",&n);
for(inti=1;i<=n;i++) scanf("%d",&num), heap_push(num); // 边插边建for(inti=1;i<=len;i++) printf("%d ",a[i]); puts("");
for(inti=1;i<=n;i++) scanf("%d",&a[++len]);
heap_build();                                           // 插完再建for(inti=1;i<=len;i++) printf("%d ",a[i]); puts("");
heap_sort();
for(inti=0;i<k;i++) printf("%d ",b[i]); puts("");
return0;
}

STL版:

#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define ssclr(ss) ss.clear(), ss.str("")#define INF 0x3f3f3f3f#define MOD 1000000007usingnamespacestd;
typedeflonglongll;
vector<int>v, v1;
intmain()
{
intn,a;
scanf("%d",&n);
// 边插边建for(inti=1;i<=n;i++) scanf("%d",&a), v.push_back(a), make_heap(v.begin(),v.end(),greater<int>()); // make_heap or push_heapfor(inti=0;i<v.size();i++) printf("%d ",v[i]); puts("");
// 插完再建for(inti=1;i<=n;i++) scanf("%d",&a), v1.push_back(a);
make_heap(v1.begin(),v1.end(),greater<int>());
for(inti=0;i<v1.size();i++) printf("%d ",v1[i]); puts("");
// 先将待插入的元素插入到底层容器的末端,通过 push_back 函数实现。// 再调用 push_heap(b,e,cmp) 函数堆新插入的元素做向上调整。for(inti=1;i<=n;i++) scanf("%d",&a), v.push_back(a);
push_heap(v.begin(),v.end(),greater<int>());
for(inti=0;i<v.size();i++) printf("%d ",v[i]); puts("");
// 先调用pop_heap函数将首部的元素与尾部元素交换,再将原尾部的元素做向下调整操作。此时,原堆顶元素被放置在最后一个位置,并未从底层容器中删除。// 若要实现真正的元素删除,可以调用底层容器的pop_back函数。for(inti=1;i<=n;i++) scanf("%d",&a), v.push_back(a);
pop_heap(v.begin(),v.end(),greater<int>());
v.pop_back();
for(inti=0;i<v.size();i++) printf("%d ",v[i]); puts("");
return0;
}
目录
相关文章
|
网络安全 API 数据库
如何处理淘宝开放平台订单接口调用时出现的错误?
在处理淘宝开放平台订单接口调用时,常遇到认证、参数、调用限制、网络及接口本身等问题。解决方法包括正确注册与认证账号、确保参数合法、控制调用频率、检查网络连接和防火墙设置、关注接口更新、处理错误码等。若问题持续,可联系技术支持。
|
SQL 关系型数据库 MySQL
MYSQL-SQL语句性能优化策略以及面试题
MYSQL-SQL语句性能优化策略以及面试题
301 1
|
1月前
|
安全 关系型数据库 MySQL
MySQL包安装 -- SUSE系列(离线RPM包安装MySQL)
本文详细介绍在openSUSE系统上通过离线RPM包安装MySQL 8.0和8.4版本的完整步骤,包括下载地址、RPM包解压、GPG密钥导入、使用rpm或zypper命令安装及服务启动验证,涵盖初始密码获取与安全修改方法,适用于无网络环境下的MySQL部署。
316 3
MySQL包安装 -- SUSE系列(离线RPM包安装MySQL)
|
2月前
|
安全 Linux iOS开发
Burp Suite Professional 2025.9 发布 - Web 应用安全、测试和扫描
Burp Suite Professional 2025.9 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
347 0
Burp Suite Professional 2025.9 发布 - Web 应用安全、测试和扫描
|
6月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的2FSK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
本项目基于Vivado2019.2实现FSK调制解调系统仿真,包含FSK调制/解调模块、AWGN信道模块、误码统计模块及帧同步模块等。通过设置SNR(如10dB、20dB)验证系统性能,并展示FSK调制解调过程。理论部分介绍频移键控(FSK)原理,包括相位连续与不连续特性、功率谱密度特点及其解调方法。Verilog核心程序实现调制、加噪、解调和误码计算功能,为数字通信系统设计提供参考。
210 35
|
人工智能 运维 安全
阿里云通过ISO42001人工智能管理认证,引领AI治理推动协同共治
9月19日,在杭州云栖大会「AI治理与安全论坛」上,阿里云宣布通过人工智能技术的全生命周期管理ISO42001体系认证。该项认证由国际标准化组织(ISO)和国际电工委员会(IEC)制定,是第一部可认证的人工智能国际管理体系标准。
649 14
|
10月前
|
C# 开发工具 C++
code runner 运行C#项目
本文介绍了如何修改Code Runner设置使 Visual Studio Code (VS Code) 能直接运行完整的 C# 项目。传统方式依赖 cscript 工具,仅支持 .csx 文件,功能受限且已停止维护。新配置使用 `dotnet run` 命令,结合一系列炫酷的cmd指令,将指令定位到具体的csproj文件上进行运行。
514 38
|
9月前
|
存储 移动开发 JavaScript
网页 HTML 自动播放下一首音乐
在 HTML5 中实现自动播放下一首音乐,通过管理音乐列表、操作音频元素和监听事件完成。创建包含多个音乐链接的列表,使用 `&lt;audio&gt;` 元素加载音乐,监听 `ended` 事件,在当前音乐结束时自动播放下一首。示例代码展示了如何使用 JavaScript 实现这一功能,确保无缝切换音乐。
|
11月前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十二、自定义一个运动分析器,实现计时计数01
随着AI技术的发展,AI运动APP如雨后春笋般涌现,如“乐动力”、“天天跳绳”等,推动了云上运动会、线上健身等热潮。本文将指导你从零开始开发一个AI运动小程序,利用“云智AI运动识别小程序插件”,介绍运动识别原理、计量方式及运动分析器基类的使用,帮助你在小程序中实现运动计时和计数功能。下篇将继续探讨运动姿态检测规则的编写。
|
数据挖掘
【杂学笔记甲】问题分析和解决的流程及工具介绍
【10月更文挑战第2天】该文档详细介绍了问题解决的过程,包括定义问题、测量问题、分析问题、改善问题和控制问题五个阶段。在定义问题阶段,通过组建跨职能团队和运用4W1H方法明确问题;测量问题阶段则通过逻辑图和流程图等工具进行数据分析;分析问题阶段筛选关键原因并确认;改善问题阶段提出并筛选方案,进行试运行;最后控制问题阶段实施前后对比并总结经验,为后续挑战做准备。
434 11
【杂学笔记甲】问题分析和解决的流程及工具介绍