这一系列函数是在做 这道题 时发现的

这道题空间卡的很死,是不能用数组存下所有数字进行快排的

后来又尝试用 \(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 算法函数的更多相关文章

  1. 求用delphi编写的LRC校验位算法函数,急!!!

    求用delphi编写的LRC校验位算法函数,急!!! 某命令串为":010200000001FC" 其16进制为“3A 30 31 30 32 30 30 30 30 30 30 ...

  2. STL中heap算法(堆算法)

     ①push_heap算法 以下是push_heap算法的实现细节.该函数接收两个迭代器,用来表现一个heap底部容器(vector)的头尾,而且新元素已经插入究竟部的最尾端. template ...

  3. C++STL算法函数总结

    容器自己定义了的算法vector:swaplist:swap,merge,splice,remove,remove_if,reverse,uniquedeque:swapmap,set,multise ...

  4. 康盛(discuz )牛逼的PHP加解密算法函数

    1.前言 康盛的 authcode 函数很牛叉,是一个具有有效期的加解密函数,同一个字符每次加密所产生的结果都是不一致的,并且可以自定义设置过期时间. 设计原理:authcode 是使用异或运算进行加 ...

  5. C++ vector类型要点总结(以及各种algorithm算法函数)

    概述 C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现. 容器向量也是一个类模板.vector是C++标准模 ...

  6. MATLAB分类与预测算法函数

    1.glmfit() 功能:构建一个广义线性回归模型. 使用格式:b=glmfit(X,y,distr),根据属性数据X以及每个记录对应的类别数据y构建一个线性回归模型,distr可取值为:binom ...

  7. C++中全排列算法函数next_permutation的使用方法

    首先,先看对next_permutation函数的解释: http://www.cplusplus.com/reference/algorithm/next_permutation/?kw=next_ ...

  8. php红包算法函数[优化]

    php红包算法 <?php header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 $total=10000; ...

  9. iOS中一些算法函数

    rand() --- 随机数 求随机数 a-b     arc4random()%(b-a+1)+a abs() labs() ---- 整数绝对值 fabs()  fabsf()  fabsl() ...

  10. C++ STL Heap算法

    #include <iostream>#include <algorithm>#include <vector> using namespace std; int ...

随机推荐

  1. 实验一 密码引擎-2-OpenEuler-OpenSSL测试

    任务详情 在Ubuntu编写代码测试OpenSSL功能,包含Base64,SM2,SM3,SM4算法的调用,然后在OpenEuler中重现 提交代码链接和运行结果截图 加分项:在Windows中重现 ...

  2. BlendCAC: A Smart Contract Enabled Decentralized Capability-Based Access Control Mechanism for the IoT

    摘要 BlendCAC,它是一种分散的.基于联合能力的 AC 机制,可有效保护大规模物联网系统中的设备.服务和信息.引入了基于联合能力的委托模型 (FCDM) 以支持分层和多跳委托.探索了委托授权和撤 ...

  3. 2021-1-31 group class note

    Lesson aim By the end of this lesson, Ss will be able to talk about restaurant food using verbs of p ...

  4. mysql5.7 不兼容问题

    通过navicat工具导入psc数据库备份文件,报错如下,mysql版本5.7 执行如下语句不通过 DROP TABLE IF EXISTS `guard_user`; CREATE TABLE `g ...

  5. 【虚拟机】虚拟机安装win10

    VMware-workstation 16 pro 点击查看代码 密钥: ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF7 ...

  6. CentOS7 设置防火墙、开放指定端口操作

    1, 查看防火墙状态: firewall-cmd --state systemctl status firewalld.service 2, 开启防火墙: systemctl start firewa ...

  7. xorg 屏幕分辨率设置(x11分辨率设置/linux分辨率设置)

    记录一下,用于linux虚拟机分辨率设置.https://blog.csdn.net/weixin_36084095/article/details/116839103(在谷歌搜索是简书的文章,在百度 ...

  8. codeforces 165C Another Problem on Strings 二分or双指针

    题意:给一个01字符串s,找出s包含恰好k个1的连续字串个数 解法: 显然是简单的双指针or二分的题,但由于k=0的存在,使得双指针的边界条件十分难写,所以应该选择二分! #include<bi ...

  9. linux系统安装谷歌浏览器设置开机自动启动并打开指定页面

      要在Linux系统上安装Google Chrome浏览器,可以按照以下步骤: 下载Google Chrome浏览器的安装包,你可以从Google的官方网站或者第三方下载站点上获取. 解压缩安装包并 ...

  10. IDEA 开发SSM

    1.配置MAVEN 2.初始化SpringBoot 官网API:https://spring.io/projects/spring-boot 初始化SpringBoot:https://start.s ...