思路
经典题,比较简单
因为要求中位数,所以拿两个优先队列去维护,一个大顶堆,一个小顶堆
大顶堆维护比较小的那一半,堆顶就是中间数了。
小顶堆维护比较大的那一半,堆顶自然就是中间数。
如果序列是奇数个的时候,不妨把多的一个放在大顶堆内,那么答案就是大顶堆的 堆顶了
当两个堆都不为空时候,边插入,边比较堆顶大小即可。
#include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(0); int _;cin>>_; while(_--){ int cas,n;cin>>cas>>n; int num=0; cout<<cas<<" "<<(n+1)/2<<endl; priority_queue<int> q1;//大顶堆 priority_queue<int,vector<int>,greater<int>>q2;///小顶堆 for(int i=1;i<=n;i++){ int x;cin>>x; if(i&1) q1.push(x); else q2.push(x); if(i>=2){//保证两个堆都不为空 if(q1.top()>q2.top()){ int a=q1.top(),b=q2.top(); q1.pop();q2.pop(); q1.push(b),q2.push(a); } } if(num==10) cout<<endl,num=0; if(i&1) cout<<q1.top()<<" ",num++; } cout<<endl; } return 0; }