zoukankan      html  css  js  c++  java
  • 【洛谷P1801】黑匣子——优先队列

    题目链接

    一道有点意思的题目
    我们可以维护两个优先队列:pqmin和pqmax
    其中 pqmin 是小根堆, pqmax 是大根堆
    每次 add 一个数字,则将数字推入到 pqmin 中
    每次 get 时,从 pqmin 的堆顶拿出一个数字并输出,然后把这个数字推入到 pqmax 中
    维护 pqmax 中的每一个元素都小于等于 pqmin,即每次向pqmin推入元素后,比较 pqmax 和 pqmin 的堆顶元素。如果 pqmax 堆的堆顶元素大于 pqmin 堆顶的元素,则将 pqmin 堆顶的元素推入 pqmax,同时把 pqmax 堆顶的元素推入 pqmin 中
    维护 pqmax 中的元素个数恒定为 i 个
    则第 i + 1 个最小值一定是 pqmin 的堆顶

    AC代码(注意,我这里是在推入 pqmin 前就判断了是否不满足上面的条件,提前推入到 pqmax 中)

    #include <bits/stdc++.h>
    
    using namespace std;
    const int MAXN = 200010;
    
    int lists[MAXN];
    
    priority_queue<int, vector<int>, greater<int>> pqmin;
    
    priority_queue<int> pqmax;
    
    int main()
    {
    #ifdef ACM_LOCAL
        freopen("./in.txt", "r", stdin);
        freopen("./out.txt", "w", stdout);
    #endif
        ios::sync_with_stdio(false);
        int m, n;
        cin >> m >> n;
        for (int i = 0; i < m; i++)
        {
            cin >> lists[i];
        }
        int cur = 0;
        for (int i = 0; i < n; i++)
        {
            int temp;
            cin >> temp;
            while (cur < temp)
            {
                if (!pqmax.empty() && lists[cur] < pqmax.top())
                {
                    pqmin.push(pqmax.top());
                    pqmax.pop();
                    pqmax.push(lists[cur]);
                }
                else
                {
                    pqmin.push(lists[cur]);
                }
                cur++;
            }
            cout << pqmin.top() << endl;
            pqmax.push(pqmin.top());
            pqmin.pop();
        }
        return 0;
    }
    
  • 相关阅读:
    UVA11825 Hackers' Crackdown
    UVA 11346 Probability
    Codeforces 12 D Ball
    bzoj 4766: 文艺计算姬
    Codeforces 757 F Team Rocket Rises Again
    [HAOI2011] problem C
    Atcoder 3857 Median Sum
    bzoj4399 魔法少女LJJ
    bzoj2638 黑白染色
    bzoj4197 [Noi2015]寿司晚宴
  • 原文地址:https://www.cnblogs.com/mauve-hkq/p/12173150.html
Copyright © 2011-2022 走看看