[NHZXOI2017]【2016NOIP】堆复习
来源:互联网 发布:wnacg新域名wnacg.net 编辑:程序博客网 时间:2024/06/06 10:15
堆是一种数据结构,分为两类——最大堆和最小堆(按我目前所学)
主要的操作有插入和删除,维护的方式有上移和下移。
我规定:
插入:Insert(int num);
删除:delete_top();(删除根节点);
上移:sift_up(int i);
下移:sift_dow(int i);
堆:h[i]
各个子程序的代码:
插入:插入到尾部+上移
void Insert(int num){h[0]++;h[h[0]]=num;sift_up(h[0]);}
删除:删除堆顶,把最后的一个数放上来+下移
void delete_top(){h[1]=h[h[0]]; h[h[0]]=0;h[0]--;sift_down(1);}
上移:
void sift_up(int i){bool done=false;while (i!=1 && !done){if (h[i]>h[i/2]) swap(h[i],h[i/2]); else done=true;i/=2;}}
下移:
void sift_down(int i){bool done=false;while (i*2<=n && !done){i*=2;if (i+1<n && h[i]<h[i+1]) i++;if (h[i/2]<h[i]) swap(h[i],h[i/2]); else done=true;}}
建堆方式:
①一个一个地插入到尾部+上移。
②在原有的一列数的基础上,对第1~n/2个数进行下移。
总结:个人认为还是规范个人写法,形成个人风格比较好。之前学习是看的资料比较多,又没吃透,导致程序码的超级丑。
堆其实不是很难,却很实用。多用于模拟、搜索、动态规划的优化之中。代码简单规范。初学者建议可以背下代码,理解就是自然而然的事情了。
1 0
- [NHZXOI2017]【2016NOIP】堆复习
- [NHZXOI2017]【2016NOIP】图论复习
- [NHZXOI2017]2016NOIP普及组复赛题解
- [NHZXOI2017]二叉堆
- NOIP 2016[图论复习]
- 【NOIp复习】dp复习列表
- 【NOIp复习】数据结构复习列表
- NOIP快速幂复习
- 【NOIP复习】【数学】
- NOIP复习篇
- 【NOIp复习】STL
- NOIP初赛总复习
- noip题目复习
- noip数论复习总结
- NOIP数学复习
- [nhzxoi2017]noip2016tg1
- [nhzxoi2017]noip2016pj
- 【NOIP模板】 堆-stl
- 数据控件 模板列的 例子<%# Eval("列名")%>
- form表单中button自动提交表单
- Mac 显示或影藏文件
- WSDL文件的基本结构
- java批处理
- [NHZXOI2017]【2016NOIP】堆复习
- epoll使用实例
- iOS判断邮箱格式
- 【Jquery实战】按下回车键触发事件
- android studio 快捷键记录
- string,StringBuffer与StringBuilder的区别
- Java Servlet单例多线程机制详解
- Emmet使用手册
- spark 2.0 ManagedBuffer 和 FileSegmentManagedBuffer