首页 > 其他 > 详细

【POJ 1442】 Black Box

时间:2015-08-10 00:19:57      阅读:279      评论:0      收藏:0      [点我收藏+]

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

【POJ 1442】 Black Box

原文:http://blog.csdn.net/challengerrumble/article/details/47382185

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!