#include<bits/stdc++.h>using namespace std;int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin>>t;while(t--){//num 表示编号,n 表示数字的数目,题目保证//n 是奇数int num,n;cin>>num>>n;//输出编号,输出奇数的时候的中位数,(n+1)/2//表示的是中位数的数目cout<<num<<" "<<(n+1)/2<<endl;//cnt 是为了保证 10 个数字一行//cnt 用来记录输出了多少个数字int cnt=0;//down 是大根堆priority_queue<int> down;//up 是小根堆priority_queue<int,vector<int>,greater<int>> up;for(int i=1;i<=n;i++){//输入一个数字int x;cin>>x;//假设数字比较小的话,存到大根堆,否则存到小根堆if(down.empty()||x<=down.top())down.push(x);elseup.push(x);//保证对顶堆的元素数目的差值比较小//当差值异常的时候,修改堆顶元素//中位数是大根堆的堆顶元素,所以大根堆比小根堆//多一个元素,大根堆的堆顶元素就是中位数if(down.size()>up.size()+1)up.push(down.top()),down.pop();if(up.size()>down.size())down.push(up.top()),up.pop();//奇数的时候if(i&1){cnt++;//输出大根堆的堆顶元素,也就是中位数cout<<down.top()<<" ";//假设刚好是 10 的倍数,换行if(cnt%10==0)cout<<endl;}}//假设不足 10 个元素也需要换行if(cnt%10)cout<<endl;}return 0;
}
对顶堆
维护一个大根堆和一个小根堆,大根堆的堆顶元素表示的是中位数,奇数的时候,大根堆的数目等于小根堆的数目加一,输入元素的时候有两个条件需要注意,假设输入的元素比较小,存放在大根堆,输入的元素比较大,存放在小根堆,第二个条件是两个堆的数目之差不能超过一定的限度
输出的时候也需要注意,每一行最多输出十个元素,可以用对十取模来实现,最后需要特判一下不足十个元素的时候,也需要换行