题意:

给出一个序列,要求将这个序列中的数字依次读入,边读入边排序,当读入序列长度为奇数时,要求输出当前序列的中位数。

思路:

因为本题要的仅仅只是中位数。不难发现中位数就是前面有n/2个比他大,后面n/2个比他小,因此可以想到对顶堆算法。

维护两个堆,一个最大堆,一个最小堆,将读入的序列从中间划分为两块。最小堆的堆首即是当前序列的中位数。每当读入一个数字时,我们就进行判断,这个数字如果比最小堆堆首元素大,则将这个元素插入最小堆中,反之则将这个数字插入最大堆中。

将数字插入到堆中之后,检查最大堆的元素个数有无超过n/2,最小堆的元素个数有无超过(n+1)/2个,如果超过,则取出堆首元素插入另一个堆中即可。

总结:

对顶堆这个算法就是用最小堆和最大堆来动态维护区间排序后某一个位置元素的信息。基本思路就是比位置为K的元素大的点都在最小堆中,比K小的元素都在大根堆中,然后维护一下两个堆内元素的个数不要超出上限,即可实现动态维护。

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define rep(i,a,b) for(int i = a; i <= b; i++)
using namespace std;
const int N = 10000+100;int n,a[N];int main()
{int T;scanf("%d",&T);while(T--){priority_queue<int> q1,q2;while(q1.size()) q1.pop();while(q2.size()) q2.pop();int id;scanf("%d%d",&id,&n);rep(i,1,n) scanf("%d",&a[i]);printf("%d %d\n",id,(n+1)/2);int cnt = 0;rep(i,1,n){if(i == 1) q2.push(-a[i]);else if(a[i] > -q2.top()) q2.push(-a[i]);else q1.push(a[i]);if(q1.size() > i/2) q2.push(-q1.top()), q1.pop();if(q2.size() > (i+1)/2) q1.push(-q2.top()), q2.pop();if(i%2){cnt++;printf("%d",-q2.top());   if(cnt % 10 == 0 || cnt == (n+1)/2) printf("\n");else printf(" ");}}}return 0;
}

【POJ3784】【对顶堆 — 动态维护中位数】Running Media相关推荐

  1. POJ - 3784 Running Median(动态维护中位数)

    题目链接:点击查看 题目大意:给出n个数,依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数 题目分析:动态维护中位数,我们可以直接用两个二叉堆来维护,一个是小顶 ...

  2. BZOJ1112洛谷P3466 [POI2008]KLO-Building blocks(砖头)[对顶堆学习笔记]

    坑爹的BZOJ因为不让 输出方案我WA了若干次 据说正解是平衡树/线段树,我不会,就用了个新东西->对顶堆 对顶堆 一个维护中位数的东西,我们通过维护两个堆,来维所有数的中位数 (显然我们可以排 ...

  3. 106. 动态中位数【经典 / 对顶堆】

    用对顶堆来维护.一个大根堆,一个小根堆. 大根堆存前一半的数据,小根堆存后一半的数据. 需要满足这样的一个条件: 大根堆最大的数<=小根堆最小的数 大根堆的数量最多比小根堆的数量多1,这样大根堆 ...

  4. 【POJ3784】Running Median(中位数,对顶堆)

    description 输入M个数,当已输入的个数为奇数个时输出此时的中位数. 一共有M/2+1个中位数要输出,每一行10个. solution 维护两个优先队列. 大根堆q1维护比当前中位数小的元素 ...

  5. C++的 STL堆 实现获取中位数

    前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 中位数: ...

  6. 神奇的东西——对顶堆

    一.定义   就是一个大根堆与一个小根堆的结合,可以用来解决动态区间第k大的问题.可以通过下图来理解.  那么我们如何建一个对顶堆呢?  上文说到,对顶堆是一种基于大根堆和小根堆的数据结构.最开始的时 ...

  7. nssl1477-赛【对顶堆,贪心】

    正题 题目大意 nnn个物品,有两个人,每个人有一些喜欢的物品. 选mmm个物品,至少选择kkk个第一个人喜欢的和kkk个第二个人喜欢的物品 解题思路 首先我们必定是选最小的 我们从小到大枚举选择多少 ...

  8. NOI.AC-保镖【贪心,对顶堆】

    正题 题目链接:http://noi.ac/contest/266/problem/795 题目大意 nnn个人第iii个巡逻一次aia_iai​秒,休息至少bib_ibi​秒. 要求 任意时刻都有人 ...

  9. linux进程池动态维护,可直接商用的跨平台c,c++动态线程池,任务池stpool库

    stpool是一个轻便高效的动态跨平台的线程池/任务池库. 常规线程池的缺点: 1. 总是启动时候就开启固定数目的线程,而不管系统的繁忙状态 (这是很浪费系统资源的). 2. 当任务繁重的时候,即使线 ...

  10. 通过Flask和Redis构造一个动态维护的代理池

    代理池的维护 目前有很多网站提供免费代理,而且种类齐全,比如各个地区.各个匿名级别的都有,不过质量实在不敢恭维,毕竟都是免费公开的,可能一个代理无数个人在用也说不定.所以我们需要做的是大量抓取这些免费 ...

最新文章

  1. 首次看清体内所有癌症转移灶,深度学习方法立大功!中国留学生一作论文登《细胞》封面...
  2. Android应用--QR的生成(二维码)
  3. java成员变量垃圾回收_JAVA 对象被垃圾回收后其成员变量可用吗? | 学步园
  4. 2015暑假训练(UVALive 5983 - 5992)线段树离线处理+dp
  5. Shiro报异常org.apache.shiro.authz.AuthorizationException: Not authorized to invoke method:
  6. HTML-CSS-JS Prettify报错Node.js was not found 解决方法
  7. bootstraptable获取所有数据_关于Redis中的五种数据结构,要知其然知其所以然
  8. c语言开发实际,21实际c语言教程-1 (转)
  9. 电子秤PCBA方案的功能及设计
  10. 学计算机用苹果本,新手小白用苹果电脑搞科研,学会这些才不至于尴尬!
  11. android照片美颜项目_android 美颜滤镜效果的实现
  12. 白马非马----继承 (转)
  13. Transaction marked as rollbackOnly
  14. 1227. 飞机座位分配概率
  15. Bitmap毛边问题
  16. Apache优化相关
  17. 计算机和工业设计哪个就业前景大,工业设计专业就业前景
  18. 哪种耳机对听力伤害小?骨传导耳机能保护听力吗?
  19. android 蓝牙sco开发
  20. 人工智能学习路线 及 学习资源

热门文章

  1. 使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码)
  2. 解决使用七牛CDN导致AJAX评论报错{“ERROR”:”GET FROM IMAGE SOURCE FAILED: E405″}
  3. STC学习:便携式温度采集器
  4. 2.自编码器(去噪自编码器,DAE)
  5. OpenCV-图像处理(13、图像上采样和降采样)
  6. poi向word插入图片_【工作应用】Java根据word模板动态生成word文档(SpringBoot项目)...
  7. 1090 Highest Price in Supply Chain (25 分) 树的遍历:深度搜索+vector
  8. c语言的程序扩展,C语言符号扩展
  9. java selenium2_Selenium2(webdirver)入门之环境搭建(Java版)
  10. SHAP(SHapley Additive exPlanation):Python的可解释机器学习库