对顶堆求区间k小(大)数
时间:2022-07-25
本文章向大家介绍对顶堆求区间k小(大)数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
P1801 黑匣子_NOI导刊2010提高(06)
首先,这道题让我们求每次的第i大值,而i是会移动的——那我们就可以理解为,我们需要知道第i大值和第i+1大值(请撕烤)。那用什么数据结构呢?
- 首先,要确定第i大值,就可以知道i-1~1是从大到小的;
- 相似的,i+1~n的元素是从小到大的。
- 可以用堆来完成
我们用一个大根堆来保存前i-1大数,大根堆确定了其中的元素是从大到小的;再用一个小根堆来存剩下的数,小根堆堆顶就是第i大数。
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
char ch=getchar();int s=0,w=1;
while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}
while(ch>=48&&ch<=57){s=s*10+ch-48;ch=getchar();}
return s*w;
}
inline void write(int x)
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+48);
}
int m,n;
int a[200005],b[200005];
priority_queue<int>maxx;
priority_queue<int,vector<int>,greater<int> >minn;
int main()
{
m=read(),n=read();
for(register int i=1;i<=m;i++)
{
a[i]=read();
}
for( register int i=1;i<=n;i++)
{
b[i]=read();
}
int l=1,r;
for( register int i=1;i<=n;i++)
{
r=b[i];
for(register int j=l;j<=r;j++)
{
maxx.push(a[j]);
if(maxx.size()>=i)
{
minn.push(maxx.top());
maxx.pop();
}
}
l=r+1;
cout<<minn.top()<<endl;
maxx.push(minn.top());
minn.pop();
}
return 0;
}
- 一条insert语句导致的性能问题分析(一)(r8笔记第40天)
- 一条insert语句导致的性能问题分析(二)(r8笔记第43天)
- dataguard中的密码文件管理(r8笔记第39天)
- Mybatis_day02
- Golang构建HTTP服务(一)--- net/http库源码笔记
- Golang构建HTTP服务(二)--- Handler,ServeMux与中间件
- 使用Let's Encrypt的SSL证书配置HTTPS手记
- Mybatis_day01
- golang 如何验证struct字段的数据格式
- ggolot2 画ROC曲线
- 47. 访问MySql数据库实现增删改查 | 厚土Go学习笔记
- 39. channel管道 | 厚土Go学习笔记
- springmvc学习第二天
- 厚土Go学习笔记 | 38. goroutine轻量级线程
- 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 数组属性和方法
- Kubernetes笔记之基本概念
- 腾讯云语音识别之一句话识别
- 创建线程都有哪些方式?— Callable篇
- UiAutomator源码学习(3)-- UiObject
- RTSP协议视频流媒体播放器EasyPlayer-RTSP-OCX接口文档API接口函数定义
- Python逐行写入
- C++ this 指针
- C++ push方法与push_back方法
- 别人变强靠天赋,而我,靠思维导图
- Spring Boot 五种热部署方式
- 二叉树最小深度
- 一日一技:限定Python函数只能被特定函数调用
- 四种ABAP单元测试隔离(test isolation)技术
- Python使用对象方式获取字典的值
- Hive整合HBase实现数据同步