这道题目诡异在时间复杂度上卡你,sort函数为nlongn级别,n组测试数据也就是n方longn级别,>1e9,考场上没想出别的来,太呆。想到时间复杂度卡你,那就用空间换时间,留着优先队列和queue,该排列就排列,该按顺序如对就按顺序入,只不过需要记录下当前队列从第几个数字开始才是合法的。
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std ;
int idx ,daxiao;
const int N =1e6+7;
int q [N];
int main()
{
priority_queue<int ,vector<int>,greater<int > >st ;
int t;
scanf("%d",&t);
while(t--)
{
int a, b ;
scanf("%d",&a);
if(a==1)
{
scanf("%d",&b);
q[daxiao++]=b;
}
if(a==2)
{
if(st.size())
{
int zhi = st.top();
st.pop();
printf("%d\n",zhi);
}
else
{
printf("%d\n",q[idx++])**;//idx是指数组下标idx及之后的位是没有经过排序的。可用!**
}
}
if(a==3)
{ //这样子也就避免了重新排序,一直是线性操作,为了时间牺牲空间
while(idx<daxiao)
{
int tem= q[idx];
st.push(tem);
idx++;
}
}
}
return 0 ;
}