代码:
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 1e6;
int m,n,p;
int a[N],u[N];
priority_queue<int> s;
priority_queue<int,vector<int>,greater<int> > b;
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>u[i];
for(int i=1;i<=n;i++)
{
while(p<u[i])
{
p++;
s.push(a[p]);
b.push(s.top());
s.pop();
}
printf("%d\n",b.top());
s.push(b.top());
b.pop();
}
return 0;
}
对代码的个人理解:
可能会有人比较疑惑,为什么两个大小根堆相互倒来倒去就能准确的找到第k小的值?
我个人是这样理解的:
如果新加入一个的值,比s中的所有的值要小,那么它肯定不在考虑范围内了,因为s不为空,说明
已经输出最小的值了,要找第x小(x>1),那么为什么要取s的最大值呢?因为s中除了新输入的值以外,其它所有的值都比b中的小,并且已经输出了至少一次,所以如果s比它们都小,那么肯定不在考虑范围内,只需要考虑最大值即可