heap 算法函数
这一系列函数是在做 这道题 时发现的
这道题空间卡的很死,是不能用数组存下所有数字进行快排的
后来又尝试用 \(multiset\) 优化空间,发现不行,可能是 \(multiset\) 还有结构性存储空间
遂再尝试插排,时间又过不了...
后来发现了 \(heap\) 系列函数可以做这道题,一方面可以支持对数组或者 \(vector\) 等存储空间较小的容器进行操作,一方面时间复杂度也与 \(multiset\) 方法一样
这里介绍一下 \(heap\) 系列函数
make_heap
make_heap
函数将现有的数据转化为一个(默认最大)堆
vector<int> vec = {1, 2, 3, 4};
make_heap(vec.begin(), vec.end()); // vec : 4 2 3 1
make_heap(vec.begin(), vec.end(), greater<int>()); // 最小堆,这里 greater<int> 后面加 () 是模板类生成一个临时对象传入 make_heap 函数
// 若使用 greater<int>() 构建最小堆,之后的函数都要加上 greater<int>()
push_heap
在堆的末尾添加一个元素后,通过push_heap
对容器进行维护使其满足堆性质
注意,使用这个函数需要保证除了新添加的元素,之前的元素已经构成了一个堆
vector<int> vec = {1, 2, 3, 4};
make_heap(vec.begin(), vec.end());
vec.push_back(5); // 堆末尾添加新元素
push_heap(vec.begin(), vec.end()); // 维护堆,堆结构大小 +1
pop_heap
将堆头元素弹出(具体实现是将堆头元素与堆尾元素交换)并再次调整,使得剩下的 \(n-1\) 个元素重新满足堆结构
vector<int> vec = {1, 2, 3, 4};
pop_heap(vec.begin(), vec.end()); // 堆顶弹出,堆结构大小 -1
sort_heap
sort_heap
的功能就相当于多次调用heap_pop
直到堆为空,这样就实现了对元素的排序
用 heap 系列函数再来解决以上问题就方便多了,贴下代码
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX_N = 1e5 + 1;
int a[MAX_N];
int main() {
int n, k;
cin >> n >> k;
for (int i = 1; i <= k; ++i) cin >> a[i];
make_heap(a + 1, a + k + 1);
for (int i = 1; i <= n - k; ++i) {
int x;
cin >> x;
if (x >= a[1]) continue;
a[k + 1] = x;
push_heap(a + 1, a + k + 2);
pop_heap(a + 1, a + k + 2);
}
cout << a[1] << endl;
return 0;
}
heap 算法函数的更多相关文章
- 求用delphi编写的LRC校验位算法函数,急!!!
求用delphi编写的LRC校验位算法函数,急!!! 某命令串为":010200000001FC" 其16进制为“3A 30 31 30 32 30 30 30 30 30 30 ...
- STL中heap算法(堆算法)
①push_heap算法 以下是push_heap算法的实现细节.该函数接收两个迭代器,用来表现一个heap底部容器(vector)的头尾,而且新元素已经插入究竟部的最尾端. template ...
- C++STL算法函数总结
容器自己定义了的算法vector:swaplist:swap,merge,splice,remove,remove_if,reverse,uniquedeque:swapmap,set,multise ...
- 康盛(discuz )牛逼的PHP加解密算法函数
1.前言 康盛的 authcode 函数很牛叉,是一个具有有效期的加解密函数,同一个字符每次加密所产生的结果都是不一致的,并且可以自定义设置过期时间. 设计原理:authcode 是使用异或运算进行加 ...
- C++ vector类型要点总结(以及各种algorithm算法函数)
概述 C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现. 容器向量也是一个类模板.vector是C++标准模 ...
- MATLAB分类与预测算法函数
1.glmfit() 功能:构建一个广义线性回归模型. 使用格式:b=glmfit(X,y,distr),根据属性数据X以及每个记录对应的类别数据y构建一个线性回归模型,distr可取值为:binom ...
- C++中全排列算法函数next_permutation的使用方法
首先,先看对next_permutation函数的解释: http://www.cplusplus.com/reference/algorithm/next_permutation/?kw=next_ ...
- php红包算法函数[优化]
php红包算法 <?php header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 $total=10000; ...
- iOS中一些算法函数
rand() --- 随机数 求随机数 a-b arc4random()%(b-a+1)+a abs() labs() ---- 整数绝对值 fabs() fabsf() fabsl() ...
- C++ STL Heap算法
#include <iostream>#include <algorithm>#include <vector> using namespace std; int ...
随机推荐
- Canvas布局下使用附加属性使控件岁鼠标移动
定义附加属性 public class MoveBehavior { public static readonly DependencyProperty IsMoveAbleProperty = De ...
- 国内centerOs6的yum源都不维护了
今天需要离线安装slurm.但是用的ubt. 需要fpm一个东西.于是想用原来的centeros联网弄出来. 直接yum 结果??? http://mirrors.163.com/centos/6/ ...
- Timer VS DispatcherTimer
Timer是在ThreadPool线程池中执行的,每当计时器到期时,就会创建一个线程来执行事件处理程序.这种实现方式可能会导致一些问题,例如计时器事件处理程序可能会与主线程竞争资源,从而导致性能问题. ...
- Vue源码中的数据代理
直接开讲: 由于这个Vue底层封装的函数太多了,我这里只讲思路不说具体的执行了什么函数. const vm=new Vue({这里写一个data,可以是对象也可以是函数}) 在写这段代码的时候 ...
- EXE项目和DLL项目远程调试、Props设置说明
通用宏设置 exe项目根据平台.配置设置输出路径: dll项目根据平台.配置设置输出路径,dll文件.lib文件分别输出到自己的路径: 中间文件根据平台.配置.项目设置输出路径: 设置远程调试命令.远 ...
- core文件段错误---对应内核处理
do_page_fault __bad_area __bad_area_nosemaphore force_sig_info_fault
- scrcpy不使用adb远程控制android
1.开启服务器 CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 1.23 ...
- EMQX+阿里云飞天洛神云网络 NLB:MQTT 消息亿级并发、千万级吞吐性能达成
随着物联网技术的发展与各行业数字化进程的推进,全球物联网设备连接规模与日俱增.一个可靠高效的物联网系统需要具备高并发.大吞吐.低时延的数据处理能力,支撑海量物联网数据的接入与分析,从而进一步挖掘数据价 ...
- python 的钩子函数
一.什么是钩子函数 hook函数就是在一定条件下才会执行的函数,将自己实现的函数挂载到挂载点上 1. hook函数:就是我们自己实现的函数,函数类型与挂载点匹配(返回值,参数列表)2. 挂接:也就是h ...
- Jenkins自动化部署(linux环境)---代码提交触发Jenkins构建
1.在工程中点击构建触发器中选择Generic Webhook Trigger,填写token 2.gitee配置Webhook 选择gitee项目中的Settings->Webhooks> ...