附网址:http://acm.uestc.edu.cn/#/problem/show/1339
这道题,我觉得完全就是暴力打的吧,考虑了多种情况而已,大概这几种情况吧
1.N为奇数 插入/弹出的数在之前,那么中位数的pos--;反之,插入/弹出的数在之后,pos不变。
2.N为偶数 插入/弹出的数在之后,那么中位数的pos++;反之,插入/弹出的数在之后,pos不变;
3.弹出时,若弹出中位数,如果N为偶数,pos++;反之N为奇数,pos--;
就这么几个注意的吧
下方代码
//by liucxy
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
queue<int>q;
set<int>sum;
int N;
set<int>::iterator it,tit;
int main()
{
scanf("%d",&N);
while(N--)
{
int x;
scanf("%d",&x);
if (x==1)
{
int a;
scanf("%d",&a);
q.push(a);
sum.insert(a);
if (sum.size()==1) it=sum.begin();
if (*it < a && sum.size()%2==0) it++;
if (*it > a && sum.size()%2!=0) it--;
}
if (x==2)
{
tit=sum.find(q.front());q.pop();
if (*it < *tit && sum.size()%2==0) it--;
if (*it > *tit && sum.size()%2!=0) it++;
if (*it == *tit && sum.size()%2==0) it--;
if (*it == *tit && sum.size()%2!=0) it++;
sum.erase(tit);
}
if (x==3)
{
if (sum.size()==1) it=sum.begin();
printf("%d\n",*it);
}
}
return 0;
}