题意:多组数据,让你求出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. 用Canvas画一棵二叉树

    笔墨伺候 var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); // 然后便可以挥毫泼墨 ...

  2. 我的python学习记_02

    流程控制 算术运算符: + 加(在字符串中拼接作用) - 减 * 乘 / 除 // 商 % 取余 ** 次幂 比较运算符: > 是否大于 >= 是否大于等于 < 是否小于 != 是否 ...

  3. Java中的List接口实现类LinkedList

    package collection; import java.util.LinkedList; /* * 1.implement List接口 * 2.底层是一个链表结构:查询慢,增删快 * 注意: ...

  4. git设置本地与远程分支关联

    1.为了避免每次都进行验证,在git进行绑定ssh mkdir ~/.ssh ssh-keygen -t rsa -C "xxx@qq.com" 将生成的公钥粘贴到git中 2.本 ...

  5. 1s 创建100G文件,最快的方法是?

    在我们日常工作中,为了验证开发的功能,比如:文件上传功能或者算法的处理效率等,经常需要一些大文件进行测试,有时在四处找了一顿之后,发现竟然没有一个合适的,虽然 Linux 中也有一些命令比如:vim. ...

  6. Java学习day15

    File是文件和目录路径名的抽象表示 文件和目录可以通过File封装成对象 对于File而言,封装的不是一个真正存在的文件,只是一个路径名,它可以存在,也可以不存在,要通过后续操作把路径的内容转换为具 ...

  7. 微信授权 - wx.openSetting

    wx.openSetting({   // 唤醒授权页面    success: res => {       console.log('res',res) // 授权成功操作    },   ...

  8. 日常使用mobx的小技巧

    日常使用mobx的小技巧 由于自己开发的项目都是中小型项目,所以在技术选型上使用了mobx.但是使用过程中发现关于mobx的技术文章并不多.于是萌发出写这篇文章的想法.请轻喷. 更新控制store渲染 ...

  9. Java语言学习day08--7月7日

    ###13遍历数组​ * A:遍历数组​ * 在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历​ * B:练习​ public class ArrayDemo04 {​ publ ...

  10. Myeclipse+svn相关文章

    Myeclipse安装svn插件https://www.cnblogs.com/liuyk-code/p/7519886.html 使用svn https://jingyan.baidu.com/ar ...