​传送门​

题目大意

给你n个数,当数的数量是奇数的时候就输出它们的中位数

思路

对顶堆板子题。
维护一个大根堆一个小根堆,小根堆里面放的是大于等于中位数的数,大根堆里面放的是比中位数小的数
因为qx是小顶堆,那么qx.top()肯定就是中位数

代码

priority_queue<int> qd; 
priority_queue<int,vector<int>,greater<int> > qx;
int main(){
int t;
scanf("%d",&t);
while(t--){
int x,n;
scanf("%d%d",&x,&n);
int nn;
if(n&1){
nn=n/2+1;
}
else{
nn=n/2;
}
printf("%d %d\n",x,nn);
while(!qx.empty()){
qx.pop();
}
while(!qd.empty()){
qd.pop();
}
int cnt=0;
for(int i=1;i<=n;i++){
scanf("%d",&x);
if(qx.size()==0){
qx.push(x);
}
else{
if(x>qx.top()){
qx.push(x);
}
else{
qd.push(x);
}
}
while(qx.size()!=qd.size()&&qx.size()!=qd.size()+1){
if(qd.size()>qx.size()){
qx.push(qd.top());
qd.pop();
}
else{
qd.push(qx.top());
qx.pop();
}
}
if(i%2){
cnt++;
if(cnt%10==0||i==n){
printf("%d\n",qx.top());
}
else{
printf("%d ",qx.top());
}
}
}
}
}