黑匣子 对顶堆
对顶堆,由一个小跟堆和一个大根堆组成,且满足小跟堆堆顶大于大根堆堆顶。
-------
----- <-- 小跟堆
---
-
-
---
----- <-- 大根堆
-------
可以看出对顶堆满足从上自下一直递减的性质
而这道题要维护第(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
", sm.top());
pre=t+1;
big.push(sm.top());
sm.pop();
}
return 0;
}