基本思路
让大根堆的元素<=mid
让小根堆的元素 > mid显然如果个数是奇数个,大根堆数量要比小根堆多1
否则取出两堆堆顶元素求平均数
P1168 中位数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
板子题
#include<bits/stdc++.h>
using ll = long long;
using ull = unsigned long long;
using ari = std::array<int, 3>;
using PII = std::pair<int, int>;
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
const double eps = 1e-6;
#define int ll
int n,k;
int a[N];
void solve() {
std::cin>>n;
std::priority_queue<int> d;//默认大根堆
std::priority_queue<int,std::vector<int>,std::greater<int> > s;
// 让大根堆的元素<=mid
// 让小根堆的元素>mid
int mid=INT_MIN;
for(int i=1;i<=n;i++)
{
std::cin>>a[i];
if(i==1) mid=a[1];
if(a[i]<=mid)
{
d.push(a[i]);
}else s.push(a[i]);
if(i%2)
{
while((int)d.size()-(int)s.size()<1)
{
d.push(s.top());
s.pop();
}
while((int)d.size()-(int)s.size()>1)
{
s.push(d.top());
d.pop();
}
mid=d.top();
std::cout<<mid<<'\n';
}
}
}
signed main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int t = 1;
//std::cin>>t;
while (t--) {
solve();
}
return 0;
}
295. 数据流的中位数 - 力扣(LeetCode)
对顶堆
对奇数个偶数个都求中位数
class MedianFinder {
public:
std::priority_queue<int> l;//默认大根堆
std::priority_queue<int,std::vect