QAQ
要查询第k大的值,维护一个大根堆和一个小根堆,他们的队首元素一样,也就是说小根堆里的元素都比大根堆里的大。维护大根堆里有k个元素那么下次找答案时只需要输出小根堆的优先元素即可,然后再将小根堆的优先元素踢入大根堆23333
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
priority_queue <long long> quex;
priority_queue <long long> qued;
long long s[999999];
int f[999999];
int main()
{
int n,m;
int k=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&s[i]);
}
for(int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
f[x]++;
}
for(int i=1;i<=n;i++)
{
long long x=s[i];
if(k==0) quex.push(-x);
else
{
long long tmp=qued.top();
if(x<tmp) //如果当前元素比大根堆的优先元素小的话,将其踢入大根堆,在将大根堆的优先元素踢入小根堆
{
qued.push(x);
qued.pop();
quex.push(-tmp);
}
else
{
quex.push(-x);
}
}
while(f[i])
{
k++;
f[i]--;
long long tmp=-quex.top();//小根堆的优先元素即为答案
quex.pop();
qued.push(tmp);//把小根堆的优先元素踢入大根堆
printf("%lld\n",tmp);
}
}
return 0;
}