[DYOJ](2021.12.11)C.查询

C.查询

先来看看题目

有一个空序列A,有Q次操作,每一次操作是下列3种之一:

  • 1 x: 在序列A的末尾加入x;
  • 2: 输出A序列的第一个元素,并删除该元素
  • 3: 对A序列进行升序排序。

 

输入格式

第一行一个整数Q。 接下来有Q行,表示Q个操作,操作如题所述。 保证操作2发生的时候,序列不为空。


 

输出格式

对每一个操作2,输出答案。


 

JD分析一下:
一共只有3种操作,一是末尾加入值,二是输出排头值,三是升序排序;
灵机一动,queue是个好东西
哎,但排序咋办呢?priority_queue也是个好DX;

于是这题有了思路~~~


 

上代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int q,cz,x,cs1,s[1000010],pla=1,k;
queue<ll>in;
priority_queue<ll>ansq;
int main()
{
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        cin>>cz;
        if(cz==1)
        {
            cin>>x;
            in.push(x);
        }
        if(cz==2)
        {
            if(ansq.empty())
            {
                cout<<in.front()<<endl;
                in.pop();
            }
            else
            {
                cout<<-ansq.top()<<endl;
                ansq.pop();
            }
        }
        if(cz==3)
        {
            while(!in.empty())
            {
                ansq.push(-in.front());
                in.pop();
            }
        }
    }
    return 0; 
}

 

Tips

-ans.top()再到-in.front
这两个-号是咋回事呢?

我们排序想要达到的目的是从小到大排;

而进入ansq后却是默认从大到小排

该怎么办?凉拌

当然有解决方法啦

进入时加上-号取反

从小到大排后正好是我们想要的结果,but,数倒是多了一个-号

于是又双叒叕地灵机亿动

再在ansq里面家多一个-号再取反

最后get到answer!

JUST LIKE THIS

4 3 2 1 -4 -3 -2 -1 -1 -2 -3 -4 1 2 3 4
Thank you for your watching!

 

上一篇:commitizen进行git规范化提交


下一篇:利用asp.net Core开发webapi对接云之家智能审批数据互联控件