[POJ3784]Running Median(堆动态维护中位数)

传送门


  这题需要用到一个名为:“对顶堆”的小技巧
  我们以值建立一个大根堆,一个小根堆,假设我们现在的中位数是x,那么用大根堆来储存小于等于x的元素,用小根堆来储存大于x的元素,这样的话,大根堆的堆顶就是x,也就是现在的动态中位数。 那么也就是说我们保证大根堆里的元素都是小于小根堆的,你可以想象这两个堆是“顶”在一起的,他们是两个胖子互相挤来挤去,他们夹着的就是动态中位数,同时我们还要保证这两个堆的元素数量差=1,这里假设大根堆比小根堆多1,才能保证这个中位数是在中间的位置(两个胖子要体重差不多)
  实现的过程如下:
  我们现在读入了一个新的数x
  1、如果他比大根堆的堆顶要小,也就是说明他比当前中位数要小,那么把x插入大根堆
  2、如果他比大根堆的堆顶要大,也就是说明他比当前中位数要打,那么把x插入小根堆
  3、在维护的过程中如果发现大根堆比小根堆少,弹出小根堆的堆顶插入大根堆直至符合要求
  4、在维护的过程中如果发现大根堆的size-小根堆的size>1 ,弹出大根堆的堆顶假如小根堆直至符合要求


#include<cstdio>
#include<iostream>
#include<cs
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值