动态维护中位数 用一个大根堆和一个小根堆,大根堆存前一半,小根堆存后一半,大根堆堆顶就是中位数
#include<cstdio>
#include<queue>
using namespace std;
const int maxn = 1e5 + 5;
int ans[maxn];
priority_queue<int,vector<int>,greater<int> > smallheap;
priority_queue<int,vector<int>,less<int> > bigheap;
int main()
{
int n; scanf("%d",&n);
int x;
for(int i = 1; i <= n; i++){
scanf("%d",&x);
if(bigheap.empty() || bigheap.top() > x){
bigheap.push(x);
}
else smallheap.push(x);
if(bigheap.size() > (i+1)/2){
int tmp = bigheap.top();
bigheap.pop();
smallheap.push(tmp);
}
if(bigheap.size() < (i+1)/2){
int tmp = smallheap.top();
smallheap.pop();
bigheap.push(tmp);
}
if(i%2) ans[(i+1)/2] = bigheap.top();
}
for(int i = 1; i <= (n+1)/2; i++){
printf("%d",ans[i]);
if(i < (n+1)/2) printf("\n");
}
return 0;
}