chenfy27的刷题记录

导航

abc217E 带排序的查询

题面:初始时有个空序列A,接下来有Q组操作,每个操作的格式如下:

  • 1 x,将x追加到A的末尾。
  • 2,输出A开头的元素值,并移除。请求时保证A非空。
  • 3,对A中元素从小到大排序。

范围:Q<=2E5; x<=1E9

思路:用一个队列来维护还没有排序的元素,再用一个优先队列来维护已排序的元素。由于每次只能追加到末尾,优先队列里的元素一定在队列的前面。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)

void solve() {
    int Q;
    cin >> Q;
    queue<int> q;
    priority_queue<int> pq;
    while (Q--) {
        int op, x;
        cin >> op;
        if (op == 1) {
            cin >> x;
            q.push(x);
        } else if (op == 2) {
            if (pq.empty()) {
                cout << q.front() << "\n";
                q.pop();
            } else {
                cout << -pq.top() << "\n";
                pq.pop();
            }
        } else {
            while (!q.empty()) {
                pq.push(-q.front());
                q.pop();
            }
        }
    }
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

posted on 2024-03-09 20:50  chenfy27  阅读(9)  评论(0)    收藏  举报