对顶堆,开两个堆,一个是大根堆,一个是小根堆,然后小于中位数的都放在大根堆,大于中位数的都放在小根堆,维护两个堆的size相等或差为1即可,这样多出来的数即为中位数。
#include <bits/stdc++.h> using namespace std; int t,n,num; priority_queue<int>q1; priority_queue<int,vector<int>,greater<int>>q2; vector<int>v; int main() { cin>>t; while(t--) { cin>>num>>n; v.clear(); while(!q1.empty()) q1.pop(); while(!q2.empty()) q2.pop(); for(int i=1;i<=n;i++) { int x; cin>>x; if(i&1) { q2.push(x); q1.push(q2.top()); q2.pop(); } else { q1.push(x); q2.push(q1.top()); q1.pop(); } if(i&1) v.push_back(q1.top()); } cout<<num<<' '<<v.size()<<'\n'; for(int i=0;i<v.size();i++) { cout<<v[i]<<' '; if(i%10==9) cout<<'\n'; } if((v.size()-1)%10!=9) cout<<'\n'; } return 0; }