向一个恒递增序列中加数 一开始序列为空 不断加m个数 有n个询问 x1x2x3…xi每次个询问表示加第x个数后 第i小的数是几
两个优先队列进行维护 一个递增一个递减 令递增队列对首为当前第i小的数 因此递减队列需要存i前的数
每当序列需要加一个数时 先与递减队列比较
如果比递减队列队首(前i-1个数中最大的数)小 将该数入递减队列 把递减队列对首拿出加入递增队列 此时递增队列队首即为当前第i小的数
如果比递减队列队首大 直接加入递增队列 递增队列对首为当前第I小的数
代码如下:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int num[30001];
priority_queue <int,vector<int>,greater<int> > small;
priority_queue <int,vector<int>,less<int> > big;
int main()
{
int m,n,i,x;
scanf("%d %d",&m,&n);
for(i = 1; i <= m; ++i)
{
scanf("%d",&num[i]);
}
i = 1;
while(n--)
{
scanf("%d",&x);
while(i <= x)
{
if(big.empty() || num[i] >= big.top())
{
small.push(num[i]);
}
else
{
big.push(num[i]);
small.push(big.top());
big.pop();
}
++i;
}
x = small.top();
small.pop();
printf("%d\n",x);
big.push(x);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/challengerrumble/article/details/47382185