码迷,mamicode.com
首页 > 编程语言 > 详细

动态数组第k小,Poj(1442)

时间:2016-06-24 20:26:28      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://poj.org/problem?id=1442

本来想复制一下,然后直接sort,结果T了。

在网上看了一下,有用两个队列做的,想了半天,没看懂什么意思。后来模拟一边,总算是懂了。

这里,将要输出的第k小的数存在最小堆中,输出,压入到最大堆中(最大堆是用来存第k小之前的数,更小),循环操作中,要是发现,压人到最小堆中的数,要是比最大堆中的头结点要小,当然要交换啦。

#include <stdio.h>
#include <string.h>
#include <queue>

using namespace std;

const int maxn = 30005;
int a[maxn];

int main()
{
    int m,n;
    priority_queue<int ,vector<int>,less<int> >Q;    ///最大堆
    priority_queue<int ,vector<int>,greater<int> > QQ;    ///最小堆
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++)
        scanf("%d",&a[i]);

    int be = 1;
    for(int i=1;i<=n;i++)
    {
        int b;
        scanf("%d",&b);

        for(int j=be;j<=b;j++)
        {
            QQ.push(a[j]);
            if(!Q.empty()&&Q.top()>QQ.top())
            {
                int tmp;
                tmp = Q.top();
                Q.pop();
                Q.push(QQ.top());
                QQ.pop();
                QQ.push(tmp);
            }
        }
        be=b+1;
        printf("%d\n",QQ.top());
        Q.push(QQ.top());
        QQ.pop();
    }
    return 0;
}

 

动态数组第k小,Poj(1442)

标签:

原文地址:http://www.cnblogs.com/TreeDream/p/5615266.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!