黑匣子 对顶堆
Posted santiego
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑匣子 对顶堆相关的知识,希望对你有一定的参考价值。
黑匣子 对顶堆
对顶堆,由一个小跟堆和一个大根堆组成,且满足小跟堆堆顶大于大根堆堆顶。
-------
----- <-- 小跟堆
---
-
-
---
----- <-- 大根堆
-------
可以看出对顶堆满足从上自下一直递减的性质
而这道题要维护第\(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;
以上是关于黑匣子 对顶堆的主要内容,如果未能解决你的问题,请参考以下文章