题目
题解思路
priority_queue <int> q1; //默认 大顶堆
priority_queue <int,vector<int>,greater<int> > q2 ; //小顶堆
只需要让小顶堆的所有元素都大于等于大顶堆 并且 大顶堆的元素不超过 小顶堆加1 因为我们在小顶堆顶取到中位数 。
每次照着加入元素 后面再对元素的归属做调整即可。
这题卡输出属实恶心。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
const int INF = 0x3f3f3f3f;
int main ()
{
ios::sync_with_stdio(false);
int T;
cin >> T;
while(T--)
{
int t , n ;
cin>>t>>n;
vector <int> ans ;
priority_queue <int> q1;
priority_queue <int,vector<int>,greater<int> > q2 ;
for (int i = 1 ; i <= n ; i++ )
{
int t1;
cin>>t1;
if ( q1.empty() )
q1.push(t1);
else
{
if ( q1.top() >= t1 )
{
q1.push(t1);
}else
{
q2.push(t1);
}
if ( q1.size() > q2.size() + 1 )
{
int t2 = q1.top();
q1.pop();
q2.push(t2);
}else if ( q1.size() < q2.size() + 1)
{
int t2 = q2.top();
q2.pop();
q1.push(t2);
}
}
if ( i % 2 == 1 )
ans.push_back(q1.top());
}
cout<<t<<" "<<ans.size()<<"\n";
int cnt = 0;
for ( int i = 0 ; i < ans.size() ; i++ )
{
cout<<ans[i];
cnt++;
if ( i == ans.size()-1 )
{
cout<<"\n";
break;
}
if (cnt == 10 )
{
cout<<"\n";
cnt = 0;
}else
cout<<" ";
}
}
return 0 ;
}