HDU 3282 Running Median( 对顶堆+优先队列)
原创
©著作权归作者所有:来自51CTO博客作者mb62d0cd6d0f38c的原创作品,请联系作者获取转载授权,否则将追究法律责任
传送门
题目大意
给你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());
}
}
}
}
}