分析
用stack容器作为栈,再用一个vector维持一个有序序列,用作取中值。
push时,stack入栈元素x,通过lower_bound找到在vector中>=x的位置it,并在插在it之前。
pop时,通过lower_bound找到栈顶元素在vector中的位置,并删除,然后stack出栈顶元素。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
stack<int> st;
vector<int> v;
while (n--)
{
string s;
cin >> s;
if (s == "Push")
{
int x;
cin >> x;
st.push(x);
auto it = lower_bound(v.begin(), v.end(), x);
v.insert(it, x);
}
if (s == "Pop")
{
if (st.empty()) puts("Invalid");
else
{
cout << st.top() << endl;
auto it = lower_bound(v.begin(), v.end(), st.top());
v.erase(it);
st.pop();
}
}
if (s == "PeekMedian")
{
if (st.empty()) puts("Invalid");
else
{
if (v.size() & 1) cout << v[v.size() / 2];
else cout << v[v.size() / 2 - 1];
puts("");
}
}
}
return 0;
}