L3-002 特殊堆栈 (30 分)
题目
思路
用vector和stack模拟栈,一个vector每次插入的时候用lower_bound,upper_bound
,二分查找插入的位置后用insert
插入,另用一个stack按照插入顺序存储元素,每次弹出栈顶的时候将这个stack的栈顶弹出,并根据这个元素回到vector中查找其位置并删除。由于vecxtor一直保持有序存储,所以查询时也只需要查询vec[vec.size() / 2]
就可以了(注意特判奇偶)
代码
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f
#define pb push_back
using namespace std;
typedef pair<int, int> P;
const int N = 1e4 + 10;
const int M = 1e2 + 10;
typedef long long ll;
stack<int> st;
vector<int> vec;
void read()
{
string op;
cin >> op;
if(op[1] == 'u')
{
int x;
cin >> x;
st.push(x);
vec.insert(upper_bound(vec.begin(),
vec.end(),
x), x);
}
else if(op[1] == 'o')
{
if(!st.size())
{
cout << "Invalid" << endl;
return ;
}
int x = st.top();
st.pop();
vec.erase(lower_bound(vec.begin(),
vec.end(),
x));
cout << x << endl;
}
else
{
if(!vec.size())
{
cout << "Invalid" << endl;
return ;
}
int sz = vec.size();
if(sz % 2)
cout << vec[(sz) / 2] << endl;
else
cout << vec[sz / 2 - 1] << endl;
}
}
int main()
{
int n;
cin >> n;
while(n--)
read();
return 0;
}