让priority_queue支持小根堆的几种方法
点击这里了解什么是priority_queue
前言
priority_queue默认是大根堆,也就是大的元素会放在前面
例如

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int>q;
int a[]={,,,,,};
const int n=;
int main()
{
for(int i=;i<=n;i++) q.push(a[i]);
while(q.size()!=)
printf("%d ",q.top()),q.pop();
return ;
}
它的输出结果是

那如何让priority_queue支持小根堆呢?:question:
方法一
将所有的数全部取负
这样的话绝对值小的数会变大,绝对值大的数会变小
这样就能实现小根堆了
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int>q;
int a[]={,,,,,};
const int n=;
int main()
{
for(int i=;i<=n;i++) q.push(-a[i]);
while(q.size()!=)
printf("%d ",-q.top()),q.pop();
return ;
}

方法二
利用STL中自带的小根堆,很简单,只要在定义的时候写成
就好
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;//这样就可以实现小根堆了
int a[]={,,,,,};
const int n=;
int main()
{
for(int i=;i<=n;i++) q.push(a[i]);
while(q.size()!=)
printf("%d ",q.top()),q.pop();
return ;
}

另外
priority_queue是支持自定义比较函数的
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int n=;
struct node
{
int x,y;
node(){x=y=;}
node(int a,int b){x=a;y=b;}
};
priority_queue<node>q;
bool operator<(const node &a,const node &b)
{
if(a.x!=b.x)return a.x>b.x;
return a.y<b.y;
}
int a[]={,,,,,};
int b[]={,,,,,};
int main()
{
for(int i=;i<=n;i++) q.push(node(a[i],b[i]));
while(q.size()!=)
printf("%d %d\n",q.top().x,q.top().y),q.pop();
return ;
}

注意:priority_queue自定义函数的比较与sort正好是相反的,也就是说,如果你是把大于号作为第一关键字的比较方式,那么堆顶的元素就是第一关键字最小的
还可以这么写
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int n=;
struct node
{
int x,y;
node(){x=y=;}
node(int a,int b){x=a;y=b;}
bool operator <(const node &a)const
{
if(a.x!=x) return a.x<x;
return a.y>y;
}
};
priority_queue<node>q;
int a[]={,,,,,};
int b[]={,,,,,};
int main()
{
for(int i=;i<=n;i++) q.push(node(a[i],b[i]));
while(q.size()!=)
printf("%d %d\n",q.top().x,q.top().y),q.pop();
return ;
}
让priority_queue支持小根堆的几种方法的更多相关文章
- 让IE6IE7IE8支持CSS3属性的8种方法介绍
我们都知道,IE浏览器暂不支持CSS3的一些属性.国外的工程师们,不安于此现状,他们总是尽量使用一些手段使IE浏览器也能支持CSS3属性,我觉得这些都是很有意义,很有价值的工作,可以推动整个技术领域的 ...
- 让IE6/IE7/IE8支持CSS3属性的8种方法介绍
我们都知道,IE浏览器暂不支持CSS3的一些属性.国外的工程师们,不安于此现状,他们总是尽量使用一些手段使IE浏览器也能支持CSS3属性,我觉得这些都是很有意义,很有价值的工作,可以推动整个技术领域的 ...
- priority_queue()大根堆和小根堆(二叉堆)
#include<iostream> #include <queue> using namespace std; int main() { //对于基础类型 默认是大顶堆 pr ...
- 洛谷 P3378 【模板】堆(小根堆)
题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: ...
- T-shirt buying CodeForces - 799B (小根堆+STL)
题目链接 思路: 由于题目说了只有1,2,3,三种色号的衣服,然后开三个对应色号的小根堆, 我是根据pair<int,int> 创建了一个以价格小的优先的优先队列. pair中的另外一个i ...
- CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)
CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...
- 【CF799B】T-shirt buying(一道很水的小根堆)
点此看题面 大致题意: 有\(n\)件T恤衫,告诉你每件T恤衫的价格以及它正面和反面的颜色(\(1≤\)颜色的编号\(≤3\)),现在有m个顾客,已知每个人想要的衣服的颜色(一件T恤衫只要有一面的颜色 ...
- 优先队列实现 大小根堆 解决top k 问题
摘于:http://my.oschina.net/leejun2005/blog/135085 目录:[ - ] 1.认识 PriorityQueue 2.应用:求 Top K 大/小 的元素 3 ...
- bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle——小根堆+大根堆+贪心
Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1& ...
随机推荐
- DB2 数据库的安装配置及监控
一.DB2简介 IBM公司研制的一种关系型数据库系统.DB2主要应用于大型应用系统,具有较好的可伸缩性,可支持从大型机到单用户环境,应用于OS/2.Windows等平台下. DB2提供了高层次的数据利 ...
- Linux下CenOS系统 安装Mysql-5.7.19
1.输入网址https://www.mysql.com/downloads/,进入downloads,选择Community 2.选择对应的版本和系统: 输入命令:wget https://cdn.m ...
- 机器学习之正则化(Regularization)
1. The Problem of Overfitting 1 还是来看预测房价的这个例子,我们先对该数据做线性回归,也就是左边第一张图. 如果这么做,我们可以获得拟合数据的这样一条直线,但是,实际上 ...
- [python] python django web 开发 —— 15分钟送到会用(只能送你到这了)
1.安装python环境 1.1 安装python包管理器: wget https://bootstrap.pypa.io/get-pip.py sudo python get-pip.py 1. ...
- HTTP协议概念与特点,HTTP的状态码,HTTPS是什么?
很多人在打开网页的时候,在浏览器地址栏里都会看到http ,在Java WEB里,HTTP也是个重点内容,今天我们就来详细了解和学习HTTP . HTTP是Hyper Text Transfer P ...
- [Swift]LeetCode153. 寻找旋转排序数组中的最小值 | Find Minimum in Rotated Sorted Array
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- Node.js 种子下载器
Node.js 种子下载器 庆祝 2018 国庆,制作了一个 Node.js 的种子下载器.爬取页面,根据页面的链接,破解另外一个网站,下载种子文件.项目比较简单,爬取页面没有使用任何爬虫框架.项目源 ...
- C++函数重载,重写,重定义
目录 1 重载 2 重写 3 重定义 4 函数重载二义性 笔者原创,转载请注明出处 C++中经常会提到重载,除了重载,还有重写,重定义,下面对这三个概念逐一进行区分 1 重载 函数重载是同 ...
- 当初要是看了这篇,React高阶组件早会了
当初要是看了这篇,React高阶组件早会了. 概况: 什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说 ...
- Java第二次上机随笔
主要是一些原来不懂但是本次上机涉及到的内容... 一.空数组与数组为null的区别 1.空数组: int[] array = new int[0]; array.length == 0; 空数组是一个 ...