这个题为栈进出的模拟,以及对栈中的元素输出第(栈的大小+1)/2小的元素。
这里如果用快速排序会有很多个case不通过,因此这道题需要用树状数组+二分法。
所谓的树状数组是一个查询和求和都是log(n)的一种数组结构,具体函数参考树状数组的博客。点击打开链接
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
using namespace std;
vector<int> v;
vector<int> s;
struct tree
{
vector<int> qq=vector<int>(100005,0);
int lowbit(int t)
{
return t&(-t);
}
void update(int t,int d)
{
while(t<=100000)
{
qq[t]+=d;
t+=lowbit(t);
}
}
int getsum(int t)
{
int sum=0;
while(t)
{
sum+=qq[t];
t-=lowbit(t);
}
return sum;
}
int findd(int val,int l=1,int r=100000)
{
if(l==r)
return l;
int mid=(l+r)/2;
if(getsum(mid)<val)
{
return findd(val,mid+1,r);
}
else
{
return findd(val,l,mid);
}
}
};
tree tr;
int main()
{
int n;
scanf("%d",&n);
int num=0;
for(int i=0;i<n;i++)
{
char a[12];
scanf("%s",a);
if(a[1]=='o')
{
if(num==0)
{
printf("Invalid\n");
}
else
{
printf("%d\n",s.back());
tr.update(s.back(),-1);
s.pop_back();
num--;
}
}
else if(a[1]=='e')
{
if(num==0)
{
printf("Invalid\n");
}
else
{
printf("%d\n",tr.findd((num+1)/2));
}
}
else
{
int tt;
scanf("%d",&tt);
s.push_back(tt);
tr.update(tt,1);
num++;
}
}
}