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

Posted 树的种子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态数组第k小,Poj(1442)相关的知识,希望对你有一定的参考价值。

题目链接: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)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1442 Black Box(优先队列)

POJ 1442 Black Box(treap树)

poj1442(treap求第k大)

POJ 1442 优先队列 模板

caioj1442:第k小的数Ⅱ

poj 1442