106. 动态中位数经典 / 对顶堆
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了106. 动态中位数经典 / 对顶堆相关的知识,希望对你有一定的参考价值。
用对顶堆来维护。一个大根堆,一个小根堆。
大根堆存前一半的数据,小根堆存后一半的数据。
需要满足这样的一个条件:
- 大根堆最大的数<=小根堆最小的数
- 大根堆的数量最多比小根堆的数量多1,这样大根堆的堆顶就是中位数
#include<bits/stdc++.h>
using namespace std;
int t,id,n;
int main(void)
cin>>t;
while(t--)
cin>>id>>n;
printf("%d %d\\n",id,(n+1)/2);
priority_queue<int>maxv_heap;//存前一半数据
priority_queue<int,vector<int>,greater<int>> minv_heap;//存后一半数据
int cnt=0;
for(int i=1;i<=n;i++)
int x; cin>>x;
if(maxv_heap.empty() || x<=maxv_heap.top()) maxv_heap.push(x);
else minv_heap.push(x);
if(maxv_heap.size()>minv_heap.size()+1)
minv_heap.push(maxv_heap.top()),maxv_heap.pop();
if(maxv_heap.size()<minv_heap.size())
maxv_heap.push(minv_heap.top()),minv_heap.pop();
if(i&1)
printf("%d ",maxv_heap.top());
cnt++;
if(cnt&&(cnt%10==0)) puts("");
if(cnt%10) puts("");
return 0;
以上是关于106. 动态中位数经典 / 对顶堆的主要内容,如果未能解决你的问题,请参考以下文章