模板 - 对顶堆
时间:2019-06-13
本文章向大家介绍模板 - 对顶堆,主要包括模板 - 对顶堆使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
https://www.luogu.org/problemnew/show/P1168
https://www.luogu.org/problemnew/show/P3871
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Double_Heap{
//对顶堆动态维护一段只能添加的序列,寻找其中的第k大值
//当然要是删除也是第k大值是可以维护的
//由于堆排序的特殊性每次调整k的位置不需要对整个序列进行重排,在k变化不是很剧烈的情况很好
//O(dklogn)dk是k的变化量
priority_queue<int> mpq;//存放最小的若干个数的大顶堆
priority_queue<int,vector<int>,greater<int> > Mpq;//存放最大的若干个数的小顶堆
//需要的元素维持在mpq的堆顶
void insert(int num){
if(!Mpq.empty()&&num>Mpq.top()){
//保证Mpq里放的是最大的若干个数,若新数比Mpq最小的要大,则交换
Mpq.push(num);
num=Mpq.top();
Mpq.pop();
}
mpq.push(num);//新数插入小根堆
}
int find_kth(int k){
//寻找第k大数,k从1开始计算,需要保证k在size范围内
while(mpq.size()>k){
//mpq现在元素过多,把他们插进Mpq
Mpq.push(mpq.top());
mpq.pop();
}
while(mpq.size()<k){
//mpq现在元素过少,把从Mpq插回来
mpq.push(Mpq.top());
Mpq.pop();
}
return mpq.top();
}
}dh;
int n,b;
int a[100005];
int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
dh.insert(a[i]);
if(i&1){
printf("%d\n",dh.find_kth((i+1)/2));
}
}
}
原文地址:https://www.cnblogs.com/Yinku/p/11016017.html
- 用psake来简化自动化脚本的构建
- TESLA V100如何让质疑GPU的流言“失声”
- Web 前端性能优化相关内容解析
- Service Broker 无法工作的问题修复
- .NET代码快速转换成powershell代码
- 网站性能评分工具Yslow 使用教程
- Temp权限引起的WCF问题
- WordPress 中强制设置 特色图像 才能发表文章
- 实用工具SDelete
- 抢饭碗的来了,毕业干哪行都可能没前途!
- [C#1] 2-类型基础
- WCF服务中操作FormsAuthentication的Cookie
- [C#1] 5-属性
- 制作WordPress“带Gravatar头像评论”小工具(集成主题中、含选项)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C#将引用的dll嵌入到exe文件中
- C# 软件版本号
- C# 实现登录并跳转界面
- QT 常用控件操作实例集锦
- C# Socket TCP发送图片与接收图片
- ingress通过daemonSet,nodeSelector,hostNetwork方式部署
- Oracle参数解析(event)
- Qt读写文件(2种方式)实现详解
- 字符串匹配 - KMP算法
- c# 判断文件是否发生了变化
- C# 用IrisSkin4.dll美化你的WinForm
- Oracle参数解析(shared_pool_size)
- C# GTS四轴运动控制器实例(固高科技步进电机不带编码器)
- Oracle参数解析(pre_page_sga)
- C#简单爬取数据(.NET使用HTML解析器NSoup和正则两种方式匹配数据)