好吧,第一次用set写,写的巨慢,主要是不熟悉,例如反向可以用 s.rbegin()我也是郁闷其实这道用set还是蛮简单的,只是,要放假了,啦啦啦。
1.反向遍历用rbegin 不要用 end 反着来,你会后悔
2.每次操作完后更新两边
#include<cstdio>
#include<cstring>
#include<iostream>
#include<set>
#include<queue>
using namespace std;
set<int>l;
set<int>r;
queue<int>q;
int n,cnt;
void solve(){
if(l.size()<r.size()-1){
l.insert(*r.begin() );
r.erase(*r.begin() );
}else if(l.size()>r.size()){
r.insert(*l.rbegin() );
l.erase(*l.rbegin() );
}
}
void pus(int x){
if(r.empty()||x>*r.begin() ) r.insert(x);
else l.insert(x);
solve();
}
void del(int x){
if(x>*l.rbegin() ){
r.erase(x);
}else {
l.erase(x);
}
solve();
}
int main(){
scanf("%d",&n);
int a,b;
for(int i=1;i<=n;i++){
scanf("%d",&a);
if(a==1){
scanf("%d",&b);
q.push(b);
pus(b);
}
if(a==2){
int x=q.front() ;
q.pop();
del(x);
}
if(a==3){
printf("%d\n",*r.begin() );
}
}
return 0;
}