学习笔记—堆
作者:互联网
堆学习笔记
一、何为堆
堆(Heap)是一类特殊的数据结构,是最高效的优先级队列。堆通常是一个可以被看做一棵完全二叉树的数组对象。通常分为大顶堆(降序数组)和小顶堆(升序数组)
二、实现方法及基本操作
1.如何定义
STL中堆可以用优先队列实现(使用时要加头文件),即 priority_queue<typename> name; 其默认为大顶堆,其大小顶堆的展开书写方式为
priority_queue<typename,vector<typename>,less<typename> > name;大顶堆(默认)
priority_queue<typename,vector<typename>,greater<typename> > name;小顶堆
其中typename处填数据类型(可为自定义的结构体或pair)name处填堆的名字
2.基本操作
设我们定义了一个优先队列为q,则:
q.push(x);向堆中添加元素x
q.pop();删除堆顶元素
q.top();访问堆顶元素
q.empty();判断是否为空,是返回1否返回0
三、经典例题
1.P1631 序列合并传送门
题目描述
有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2N2个和,求这N^2N2个和中最小的N个。
输入格式
第一行一个正整数N;
第二行N个整数A_iAi, 满足A_i\le A_{i+1}Ai≤Ai+1且A_i\le 10^9Ai≤109;
第三行N个整数B_iBi, 满足B_i\le B_{i+1}Bi≤Bi+1且B_i\le 10^9Bi≤109.
【数据规模】
对于50%的数据中,满足1<=N<=1000;
对于100%的数据中,满足1<=N<=100000。
输出格式
输出仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。
输入输出样例
输入
3 2 6 6 1 4 8
输出
3 6 7
分析
看数据这是一道水题,思路暴力加优化加堆排序
上代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll N=1e5+5; ll a[N],b[N],n;//记得开long long priority_queue<ll> q;//大顶堆 int main(){ cin>>n; for(int i=0;i<n;i++)cin>>a[i]; for(int i=0;i<n;i++)cin>>b[i]; sort(a,a+n); sort(b,b+n);
//先升序排一边,便于优化 for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(q.size()==n){//在已满n个是判断 if(q.top()<=a[i]+b[j])break;如相加大于已有的n个中最大的结束循环,因为后面的循环一定比前面的大 } q.push(a[i]+b[j]);//没满n个或现在的和小于之前n个中最大的话,入堆 if(q.size()>n)q.pop();//将多余n个的移除 } } for(int i=n-1;i>=0;i--){ a[i]=q.top(); q.pop();
//因为是大顶堆但题目要求要从小到大,所以倒存一边 } for(int i=0;i<n;i++)cout<<a[i]<<" "; return 0; }
如有错误,欢迎指出
标签:priority,le,name,int,queue,long,学习,笔记 来源: https://www.cnblogs.com/2009cqr/p/16475868.html