前言
传送门 :
题解千奇百怪
Vector
因为我们是需要输出 一个序列里面有序的中位数,显然我们不可能每次插入都进行一次排序
所以我们可以利用二分,索引下标之后再进行查找
CODE
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N = 10;
void cal()
{
}
void solve()
{
int n;cin>>n;
vector<int> a;
for(int i=1;i<=n;i++){
int x;cin>>x;
a.insert(upper_bound(a.begin(),a.end(),x),x);
if(i%2 == 1){
cout<<a[(i-1)/2]<<endl;
}
}
}
int main()
{
ios::sync_with_stdio(false);
solve();
return 0;
}
Heap
利用两个堆 一个大顶堆 一个小顶堆进行操作
大顶堆存放小于
m
i
d
mid
mid 的数
小顶堆存放大于
m
i
d
mid
mid 的数
(因为每个2输出一次,因此两个堆差值不超过1)
在输出的时候 如果两个堆的长度不同,那么就把当前的
m
i
d
mid
mid放入较少的那个堆中,同时令
m
i
d
mid
mid为较多的堆中的对顶元素
(相当于是用堆模拟了 )
CODE
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define heap_less priority_queue<int,vector<int>>
#define heap_greater priority_queue<int,vector<int>,greater<int>>
const int N = 10;
heap_less q1;
heap_greater q2;
void solve()
{
int n;cin>>n;
int x;cin>>x;
int mid = x;
cout<<mid<<endl;
for(int i=2;i<=n;i++){
int x;cin>>x;
if(x>mid)
q2.push(x);
else
q1.push(x);
if(i&1){
while(q1.size()!=q2.size()){
if(q1.size() > q2.size()){
q2.push(mid);
mid = q1.top();q1.pop();
}
else{
q1.push(mid);
mid = q2.top();q2.pop();
}
}
cout<<mid<<endl;
}
}
}
int main()
{
ios::sync_with_stdio(false);
solve();
return 0;
}