PTA | 程序设计类实验辅助教学平台 (pintia.cn)
#include <iostream>
#include <string>
#include <set>
#include <stack>
#include <algorithm>
using namespace std;
multiset<int> s1, s2;
stack<int> sta;
int n, a;
string str;
void update(multiset<int>& s1, multiset<int>& s2) {
int num = -*s1.begin();
s1.erase(s1.begin());
s2.insert(num);
return;
}
void myPop() {
if (sta.empty()) {
cout << "Invalid" << endl;;
return;
}
int a = sta.top();
sta.pop();
cout << a << endl;
if (!s2.empty()) {
auto it = s2.lower_bound(a);
if (it != s2.end() && *it == a) {
s2.erase(it);
if (s1.size() - s2.size() == 1) return;
update(s1, s2);
return;
}
}
auto it = s1.lower_bound(-a);
s1.erase(it);
if (s1.size() == s2.size()) return;
update(s2, s1);
return;
}
void myPeekMedian() {
if (sta.empty()) {
cout << "Invalid" << endl;
return;
}
cout << -*s1.begin() << endl;
return;
}
void myPush() {
cin >> a;
sta.push(a);
if (s1.empty() || a <= -*s1.begin()) {
s1.insert(-a);
if (s1.size() - s2.size() == 1) return;
update(s1, s2);
}
else {
s2.insert(a);
if (s1.size() == s2.size()) return;
update(s2, s1);
}
return;
}
int main() {
cin >> n;
while (n--) {
cin >> str;
if (str == "Pop") myPop();
else if (str == "PeekMedian") myPeekMedian();
else myPush();
}
return 0;
}