【POJ 1442】 Black Box

【POJ 1442】 Black Box

向一个恒递增序列中加数 一开始序列为空 不断加m个数 有n个询问 x1x2x3…xi每次个询问表示加第x个数后 第i小的数是几

两个优先队列进行维护 一个递增一个递减 令递增队列对首为当前第i小的数 因此递减队列需要存i前的数
每当序列需要加一个数时 先与递减队列比较
如果比递减队列队首(前i-1个数中最大的数)小 将该数入递减队列 把递减队列对首拿出加入递增队列 此时递增队列队首即为当前第i小的数
如果比递减队列队首大 直接加入递增队列 递增队列对首为当前第I小的数

代码如下:

#include 
#include 
#include 
#include 
#include 

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;
}

你可能感兴趣的:(POJ,栈&队列,ACM道路之数据结构)