团体程序设计天梯赛
L3-002 特殊堆栈
法一:使用vector
维护。维护两个vector
:堆栈s
和有序数组ordered
。push
和pop
操作分别查找ordered
的下界位置,使用insert()
或erase()
函数操作,时间复杂度为O(n)
;peekmedian
操作只需要取ordered
数组的中间位置值即可,时间复杂度为O(1)
。
#include <bits/stdc++.h>
using namespace std;
vector<int> s, ordered;
int main(){
int n;
cin >> n;
for(int i = 0; i <= n - 1; i++){
string temp;
int val;
cin >> temp;
if(temp == "Push"){
cin >> val;
s.push_back(val);
auto it = lower_bound(ordered.begin(), ordered.end(), val);
ordered.insert(it, val);
}
else if(temp == "Pop"){
if(s.empty() == true){
cout << "Invalid" << endl;
continue;
}
else{
val = s[(int)s.size() - 1];
cout << val << endl;
s.pop_back();
auto it = lower_bound(ordered.begin(), ordered.end(), val);
ordered.erase(it);
}
}
else if(temp == "PeekMedian"){
if(s.empty() == true){
cout << "Invalid" << endl;
continue;
}
else{
int des = ((int)s.size() - 1) / 2;
cout << ordered[des] << endl;
}
}
}
return 0;
}