动态中位数
思
路
就
是
对
顶
堆
维
护
大
根
堆
和
小
根
堆
,
让
大
根
堆
的
t
o
p
成
为
中
位
数
思路就是对顶堆维护大根堆和小根堆,让大根堆的top成为中位数
思路就是对顶堆维护大根堆和小根堆,让大根堆的top成为中位数
代码
#include<queue>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5+10;
int t, m, idx;
int arr[N];
int main()
{
cin >> t;
while(t--)
{
vector<int> res;
priority_queue<int,vector<int>,greater<int>> up;
priority_queue<int,vector<int>,less<int>> down;
cin >> idx >> m;
for(int i = 1; i <= m; i ++ ) cin >> arr[i];
for(int i = 1; i <= m; i ++ )
{
if(down.empty() || arr[i] < down.top())
{
down.push(arr[i]);
}
else
{
up.push(arr[i]);
}
if(i%2)
{
while(up.size() + 1 > down.size() )
{
down.push(up.top());
up.pop();
}
while(down.size() - 1 > up.size())
{
up.push(down.top());
down.pop();
}
res.push_back(down.top());
}
}
cout << idx << " " << (m + 1) / 2 << endl;
int cnt = 0;
for(int i = 0; i < res.size(); i++)
{
printf("%d ", res[i]);
cnt ++;
if(cnt % 10 == 0)
{
cout << endl;
}
}
if(cnt % 10)
cout << endl;
}
return 0;
}