CodeForces

来源:互联网 发布:淘宝pc 编辑:程序博客网 时间:2024/05/20 06:08

传送门
优先队列在语法(推入,删除)上与普通队列一样,不同在于声明时要这样:priority_queue

#include<cstdio>#include<queue>#include<cstring>using namespace std;const int maxn=1000005;struct node{    char ch;    int x;}op[maxn];int main(){    priority_queue<int,vector<int>,greater<int> >q;//优先队列的严格声明方式.    int n,i,k=0,u;//默认该队列中最小的数为优先级最高的数,即q.top=q.min.    char s[10];    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%s",s);        if(s[0]=='i')        {            scanf("%d",&u);            op[k].x=u;            op[k++].ch='i';            q.push(u);        }        else if(s[0]=='r')        {            if(q.empty()){//防止队列为空时,该操作非法;                op[k].x=0;                op[k++].ch='i';                q.push(0);            }            q.pop();            op[k++].ch='r';        }        else{            scanf("%d",&u);//u就是目标数.            if(!q.empty()&&q.top()==u)            {                op[k].x=u;                op[k++].ch='g';            }            else if(!q.empty()&&q.top()>u)            {                op[k].x=u;                op[k++].ch='i';                q.push(u);                op[k].x=u;                op[k++].ch='g';            }            else{                while(!q.empty()&&q.top()<u)//删到队列中最小的数小于目标数为止.                {                    op[k].x=q.top();                    op[k++].ch='r';                    q.pop();                }                if(!q.empty()&&q.top()>u || q.empty())                {                    op[k].x=u;                    op[k++].ch='i';                    q.push(u);                }                op[k].x=u;                op[k++].ch='g';            }        }    }    printf("%d\n",k);//总共最少步骤    for(int i=0;i<k;i++)    {        if(op[i].ch=='i')            printf("insert %d\n",op[i].x);        else if(op[i].ch=='r')            printf("removeMin\n");        else            printf("getMin %d\n",op[i].x);    }}