题目大意是,输入栈的命令push和pop,再实现一个寻找中位数的函数peekMedian。
刚开始用vector+sort来做(必然超时),用大小顶堆又不好实现删除元素,所以还是手动写二分法。
vector中insert/erase元素时的迭代器指向的是待插入/删除的位置。所以用同个函数findpos时,查找待插入的位置的返回值需要+1才是真正要插入的位置(直接返回值left是小于它的值,坐标left+1是大于它的值),查找元素时left就是该元素下标的值。
此外oj提交时段错误和运行超时都有可能是访问越界。
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
stack<int> s;
vector<int> v;
int findpos(int num){
int left=0,right=v.size();
if(right==0 || v[left]>num )return -1;
else if(v[right-1]<num)return right-1;
while(left!=right-1){
if(v[(left+right)/2]<=num){
left=(left+right)/2;
right=right;
}else{
left=left;
right=(left+right)/2;
}
}
return left;
}
int main() {
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
string str;
str.resize(10);
scanf("%s",&str[0]);
if(strcmp(str.c_str(),"Pop")==0){
if(s.empty()){
printf("Invalid\n");
continue;
}
printf("%d\n",s.top());
v.erase(v.begin()+findpos(s.top()));
s.pop();
}else if(strcmp(str.c_str(),"Push")==0){
int param;
scanf("%d",¶m);
s.push(param);
v.insert(v.begin()+findpos(param)+1,param);
}else{
if(s.empty()){
printf("Invalid\n");
continue;
}
if(v.size()%2==0)printf("%d\n",v[v.size()/2-1]);
else printf("%d\n",v[v.size()/2]);
}
}
}