黑匣子 对顶堆

Posted santiego

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑匣子 对顶堆相关的知识,希望对你有一定的参考价值。

黑匣子 对顶堆

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

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

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

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

以上是关于黑匣子 对顶堆的主要内容,如果未能解决你的问题,请参考以下文章

对顶堆与应用

浅谈对顶堆

黑匣子

P1168 中位数(对顶堆)

黑匣子为什么难成为“云匣子”?

poj 3784(对顶堆)