题意:多组数据,让你求出1~i(i为奇数&&i<=n)的中位数

思路:首先复杂度必为O(n)或O(nlogn)的(数据范围)

   思索,如果题目要求1次中位数,好求!排个序,取a[(n+1)/2]就好了 [这道题n的前提是奇数哈]

   可是???要求多次中位数,而且是每次加入两个数后,再求一次?

   别慌!!!已知中位数的性质是跟数值的顺序有关的。

   顺序?大家想一想有哪个数据结构能够动态维护数列顺序,并1次操作复杂度在O(logn)之内

   那当然是堆【肯定用优先队列啦】^_^

方式:【对顶堆】

   不要太在乎为何叫“对顶堆”,因为我也不知道

   通过取中间的数,可以想到维护两个堆:一个大根堆(叫她Qx),一个小根堆(叫他Qn),这两个堆的大小无论怎样动态变化都恒保持:Qx.size()-Qn.size()=1或0  [Qx.size()总是>=Qn.size()的]

   要两个堆的目的大家肯定都能想到了,因为一旦i为奇数要输出时,直接输出Qx.top()就好了。不过这只是脑补出了一些过程,请看下面:

   

   我说的有点啰嗦,大家还是看看代码吧:

#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
priority_queue<int> Qx;
priority_queue<int,vector<int>,greater<int> > Qn;
int main() {
// freopen("poj3785.out","w",stdout);
int t;
scanf("%d",&t);
while(t--) {
while(!Qn.empty()) Qn.pop();
while(!Qx.empty()) Qx.pop();
int p,n; scanf("%d%d",&p,&n);
printf("%d %d\n",p,(n+1)/2);
for(int i=1;i<=n;i++) {
int b; scanf("%d",&b);
//之所以要加上特判,因为要保证两个队列都非空,才能不运行错误
if(i==1) {
Qx.push(b); printf("%d ",b);
}
else if(i==2) {
if(b<Qx.top()) Qn.push(Qx.top()),Qx.pop(),Qx.push(b);
else Qn.push(b);
}
else if(Qx.size()==Qn.size()) { //Qx.size()必须+1
if(b<=Qn.top()) Qx.push(b);
else { //b>Qn.top()
Qx.push(Qn.top()); Qn.pop(); Qn.push(b); //将小根堆的堆头插入大根堆,并将b插入小根堆
}
printf("%d ",Qx.top());
if(((i+1)/2)%10==0) printf("\n");
}
else { //Qn.size()必须+1
if(b>=Qx.top()) Qn.push(b);
else { //b<Qx.top();
Qn.push(Qx.top()); Qx.pop(); Qx.push(b); //有没有觉得是15行的反操作呢?
}
}
}
if((n+1)/2%10!=0) printf("\n");
}
return 0;
}

有什么建议,欢迎讨论

   

poj3784(对顶堆)的更多相关文章

  1. poj3784 Running Median[对顶堆]

    由于我不会讲对顶堆,所以这里直接传上一个巨佬的学习笔记. 对顶堆其实还是很容易理解的,想这题的时候自己猜做法也能把没学过的对顶堆给想出来.后来了解,对顶堆主要还是动态的在线维护集合$K$大值.当然也可 ...

  2. hdu3282 链表或者对顶堆

    维护序列的动态中位数 第一次用链表做题..感觉指针指来指去也挺麻烦的.. 本题链表解法就是用数组模拟出一个链表,然后离线输入所有数,排序,按照输入顺序在链表里删除元素,一次性删掉两个,然后中位数指针对 ...

  3. 【uoj#280】[UTR #2]题目难度提升 对顶堆+STL-set

    题目描述 给出 $n$ 个数 $a_1,a_2,...,a_n$ ,将其排为序列 $\{p_i\}$ ,满足 $\{前\ i\ 个数的中位数\}$ 单调不降.求字典序最大的 $\{p_i\}$ . 其 ...

  4. hdu4261 Estimation[暴力dp+对顶堆]

    https://vjudge.net/problem/HDU-4261 对于一个长2000的数列划分最多25个块,每块代价为块内每个数与块内中位数差的绝对值之和,求最小总代价. 套路化地,设$f[i] ...

  5. 【POJ 3784】 Running Median (对顶堆)

    Running Median Description For this problem, you will write a program that reads in a sequence of 32 ...

  6. P1168 中位数(对顶堆)

    题意:维护一个序列,两种操作 1.插入一个数 2.输出中位数(若长度为偶数,输出中间两个较小的那个) 对顶堆 维护一个小根堆,一个大根堆,大根堆存1--mid,小根堆存mid+1---n 这样堆顶必有 ...

  7. 洛谷 - P1801 - 黑匣子 - 对顶堆

    这道题是提高+省选-的难度,做出来的话对数据结构题目的理解会增加很多. 可以使用一种叫做对顶堆的东西,对顶堆是在线维护第n小的logn的算法.大概的思路是,假如我们要找的是第n小,我们就维护一个大小为 ...

  8. bzoj 1112: [POI2008]砖块Klo【对顶堆】

    priority_queue实现的对顶堆,细节超级多WA了十几次--但是理论上是最简便的orz其实是我已经不会写平衡树了 枚举左端点,显然要把这一段的高度搞成(l,l+k-1)的高度中位数,所以需要一 ...

  9. 【Luogu P1168】【Luogu P1801&UVA 501】中位数&黑匣子(Black Box)——对顶堆相关

    Luogu P1168 Luogu P1801 UVA 501(洛谷Remote Judge) 前置知识:堆.优先队列STL的使用 对顶堆 是一种在线维护第\(k\)小的算法. 其实就是开两个堆,一个 ...

随机推荐

  1. vue常用知识点总结

    感谢本文引用链接的各位大佬们,小菜鸟我只是个搬运工 1.谈一谈你理解的vue是什么样子的? vue是数据.视图分离的一个框架,让数据与视图间不会发生直接联系.MVVM 组件化:把整体拆分为各个可以复用 ...

  2. java中请给出一个抽象类,可以继承实体类的例子

    例1.7.2(抽象类可以继承实体类)- class VehMark_to_win {    void steer() {        System.out.println("Turn st ...

  3. JAVA对XML文件的读写

    XML 指可扩展标记语言(EXtensible Markup Language),是独立于软件和硬件的信息传输工具,应用于 web 开发的许多方面,常用于简化数据的存储和共享. xml指令处理指令,简 ...

  4. Spring Boot配置文件加载顺序

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.通过spring.config.location改变配置文件的位置 二.外部配置加载顺序 1.使用命令行参数指定加 ...

  5. 用于激光雷达的 APD,SPAD 和 SiPM 分析

    1. 术语及定义 1.1 激光雷达,Light Detection And Range, LiDAR  发射激光光束,并接收回波以获取目标三维和/或速度信息的系统: 1.2 机械旋转激光雷达,Mech ...

  6. java高级用法之:在JNA中使用类型映射

    目录 简介 类型映射的本质 TypeMapper NativeMapped 总结 简介 JNA中有很多种映射,library的映射,函数的映射还有函数参数和返回值的映射,libary和函数的映射比较简 ...

  7. ArcGIS使用技巧(六)——数据视图

    新手,若有错误还请指正! 有的时候出图时有很多图层,且范围很大,而出图的范围是大范围的一个部分,当然,可以对各个图层进行裁剪,但是比较麻烦,这里介绍一个比较简单的小技巧. 类似于图1,出图的时候只想显 ...

  8. 一种O(n)时间复杂度的计数排序算法和Top N热词算法

    排序算法是研究非常广泛且超级经典的算法,主流排序算法的时间复杂度基本都在O(nlogn). 今天就介绍一种以hash表为基础的,时间复杂度能够达到O(n)的排序算法--计数排序: 同时基于它的思想,完 ...

  9. [linux tips] puppet client ssl 证书过期

    问题: [root@control-01 .ssh]# puppet agent -tv Warning: Unable to fetch my node definition, but the ag ...

  10. 【openstack】红帽公开课笔记内容openstack

    overcloud节点自省失败(introspection) 节点自省--获取overcloud