//
//map
//20 1
//25 2
//30 2 mid
//35 2
//beforemid 3
//stack
//beforemid必须小于(长度+1)/2
#include<iostream>
#include<map>
#include<stack>
using namespace std;
map<int,int>M;
map<int,int>::iterator mid;
int beforemid;
stack<int>S;
void adjust_mid(){
if(beforemid>=(S.size()+1)/2){//左移
mid--;
beforemid-=mid->second;
}
else if(beforemid+mid->second<(S.size()+1)/2){//右移
beforemid+=mid->second;
mid++;
}
}
int main()
{
int N;
cin>>N;
while(N--){
string command;
cin>>command;
if(command[1]=='u'){//push操作
int key;
cin>>key;
S.push(key);
M[key]++;
if(S.size()==1){//初始化
mid=M.begin();
beforemid=0;
}
else{
if(key<mid->first)beforemid++;
adjust_mid();
}
}
else if(command[1]=='o'){//pop操作
if(!S.size()){
cout<<"Invalid\n";
}
else{
int key;
key=S.top();
cout<<key<<endl;
S.pop();
M[key]--;
if(key<mid->first)beforemid--;
adjust_mid();
if(M[key]==0){
if(mid->first==key)mid++;
M.erase(key);
}
}
}
else {//peekmedian
if(!S.size()){
cout<<"Invalid\n";
}
else{
cout<<mid->first<<endl;
}
}
}
}
1057 Stack
最新推荐文章于 2025-06-09 20:45:18 发布