题目链接:http://poj.org/problem?id=1442
题意:有一系列数字输入,问在输入到第u个数时,排在以访问次数x(x依次增加)为名次的第x小的数。
方法:用两个优先队列实现对堆(一个最大顶堆,一个最小顶堆)的操作,当输入到第u个数,第x访问时,最大顶堆存放u个数中前x个比较小数,最小顶堆存放另u-x个数。
代码如下:
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int main()
{
priority_queue<int, vector<int>, greater<int> >Min;//最小顶
priority_queue<int> Max;//最大顶
int n, m, a[30005], t;
while (~scanf("%d%d", &n, &m))
{
for (int i=0; i<n; ++i)
scanf("%d", &a[i]);
int i = 0;
while (m--)
{
scanf("%d", &t);
while (i<t)
{
Min.push(a[i++]);
if (!Max.empty() && Max.top() > Min.top())//最大顶元素大于最小顶元素
{
int t = Max.top();
Max.pop();
Max.push(Min.top());
Min.pop();
Min.push(t);
}
}
printf("%d\n", Min.top());
Max.push(Min.top());
Min.pop();
}
}
return 0;
}