【POJ 1442】 Black Box

【POJ 1442】 Black Box

向一个恒递增序列中加数 一开始序列为空 不断加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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值