1.使用两个multiset维护中值,up和down分别存储一半的数据。
2.multiset允许元素重复,set元素不重复。
两者默认升序排列,降序使用multiset<int, greater<int>>set1;
3.常用函数:
insert(int x)
find(int x) 返回迭代器
earse(iterator it)
lower_bound(int x) 返回第一个>=x的迭代器
upper_bound
size
#include<bits/stdc++.h>
using namespace std;
stack<int> st;
multiset<int> up,down;
void ba(){
while(up.size()>down.size()){
down.insert(*up.begin());
up.erase(up.begin());
}
while(down.size()>up.size()+1){
auto it=down.end();it--;
up.insert(*it);
down.erase(it);
}
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
string op;int num;
cin>>op;
if(op=="Push"){
cin>>num;
st.push(num);
//判断
if(up.empty()||*up.begin()>num) down.insert(num);
else up.insert(num);
ba();
}
else if(op=="Pop"){
if(st.empty())cout<<"Invalid\n";
else{
int x=st.top();
auto it=down.end();it--;//up可能为空
if(*it < x ){
up.erase(up.find(x));
}
else down.erase(down.find(x));
ba();
cout<<st.top()<<endl;
st.pop();
}
}
else{
if(st.empty())cout<<"Invalid\n";
else{
auto it=down.end();it--;
cout<<*it<<endl;
}
}
}
return 0;
}