题目:https://pintia.cn/problem-sets/994805046380707840/problems/994805053695574016
题解:模拟即可,保证每次插入使得数组有序,每次弹出也要使得数组有序,每次PeekMedian,直接输出数组中间值即可,但是用普通的数组模拟前两个操作会超时的,这里我们使用vector保存数据(链式结构比较好维护),并用lower_bound来二分查找数据。
vector<int>vec;
vector<int>::iterator it;
it=lower_bound(vec.begin(),vec.end(),x);
vec.insert(it,x); // 在指定位置插入元素x
vec.erase(it); // 删除指定位置的元素
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <stack>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=100005;
int n;
string s;
int a[maxn],pos;
int mid;
stack<int>st;
vector<int>vec;
int main()
{
cin>>n;
pos=-1;
cin.get();
int tp;
vector<int>::iterator it;
while(n--)
{
getline(cin,s);
if(s.find("Pop")!=string::npos)
{
if(st.empty()) cout << "Invalid\n";
else
{
pos--;
cout << st.top() << endl;
it=lower_bound(vec.begin(),vec.end(),st.top());
vec.erase(it);
st.pop();
}
}
else if(s.find("PeekMedian")!=string::npos)
{
if(st.empty()) cout << "Invalid\n";
else
{
mid=vec[pos/2];
cout << mid << endl;
}
}
else
{
int tem=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')
tem=tem*10+s[i]-'0';
}
st.push(tem);
it=lower_bound(vec.begin(),vec.end(),tem);
vec.insert(it,tem);
pos++;
}
}
return 0;
}