这道题利用两个有序集合,第一个保存大的一半元素,从小到大排列
第二个集合保存小的一半元素,从大到小排列
调了一个小时,终于通过了
#include <iostream>
#include <set>
#include <stack>
#include <vector>
using namespace std;
int main() {
int N;
cin>>N;
stack<int> stack1;
multiset<int> set1;//由小到大,保存大的元素
multiset<int,greater<>> set2;//保存小的元素
vector<string> res;
for (int i = 0; i < N; ++i) {
string string1;
cin>>string1;
if (string1[1]=='o'){
if (stack1.empty()){
res.emplace_back("Invalid");
} else{
int val=stack1.top();
stack1.pop();
res.push_back(to_string(val));
if(set1.find(val)==set1.end()){
if (set1.size()==set2.size()) {
set2.erase(set2.find(val));
} else{
if(!set2.empty()) {
set2.erase(set2.find(val));
}
int x = *set1.begin();
set2.insert(x);
set1.erase(set1.find(x));
}
} else{//在set1中
if(set1.size()==set2.size()){
set1.erase(set1.find(val));
int x=*set2.begin();
set1.insert(x);
set2.erase(set2.find(x));
} else{
// if (!set2.empty()) {
// set2.erase(set2.find(val));
// }
// int x=*set1.begin();
set1.erase(set1.find(val));
// set2.insert(x);
}
}
}
} else if(string1[1]=='u'){
int val;
cin>>val;
stack1.push(val);
if (set1.size()==set2.size()){//两个集合当中元素数量相等
if (set2.empty()||val>=*set2.begin()){
set1.insert(val);
} else{
set2.insert(val);
int x=*set2.begin();
set1.insert(x);
set2.erase(set2.find(x));
}
} else{
if (set2.empty()||val>=*set2.begin()){
set1.insert(val);
int x=*set1.begin();
set1.erase(set1.find(x));
set2.insert(x);
} else{
set2.insert(val);
}
}
} else{
if (stack1.empty()){
res.emplace_back("Invalid");
continue;
}
if (set2.size()==set1.size()){
res.push_back(to_string(*set2.begin()));
} else{
res.push_back(to_string(*set1.begin()));
}
}
}
for(const auto& x:res){
cout<<x<<endl;
}
return 0;
}