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 4Thank you for your watching!