黑匣子 对顶堆

黑匣子 对顶堆

对顶堆,由一个小跟堆和一个大根堆组成,且满足小跟堆堆顶大于大根堆堆顶

-------
 -----  <-- 小跟堆
  ---
   -
   -
  ---
 -----  <-- 大根堆
-------

可以看出对顶堆满足从上自下一直递减的性质

黑匣子_NOI导刊2010提高 题面

而这道题要维护第\(i\)小,即是让我们维护一个对顶堆,使大根堆大小为\(i-1\),小跟堆的堆顶即是第\(i\)小。

#include <cstdio>
#include <queue>
#define MAXN 200002
using namespace std;
priority_queue<int> big;
priority_queue<int, vector<int>, greater<int> > sm;
int a[MAXN];
int hav[MAXN];
int main() {
    int m,n;
    scanf("%d %d", &m, &n);
    for(int i=1;i<=m;++i) scanf("%d", &a[i]);
    int pre=1,t;
    for(int i=1;i<=n;++i){
        scanf("%d", &t);
        for(int j=pre;j<=t;++j){
            big.push(a[j]);
            if(big.size()==i) sm.push(big.top()), big.pop(); // 维护大小i-1
        }
        printf("%d\n", sm.top());
        pre=t+1;
        big.push(sm.top());
        sm.pop();
    }
    return 0;
}
posted @ 2019-07-22 14:54  Santiego  阅读(124)  评论(0编辑  收藏  举报