首页 > 其他 > 详细

黑匣子 对顶堆

时间:2019-07-22 15:10:43      阅读:93      评论:0      收藏:0      [点我收藏+]

黑匣子 对顶堆

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

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

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

黑匣子_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;
}

黑匣子 对顶堆

原文:https://www.cnblogs.com/santiego/p/11225849.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!