• 【洛谷P1801】黑匣子_NOI导刊2010提高(06)


    题目描述

    Black Box是一种原始的数据库。它可以储存一个整数数组,还有一个特别的变量i。最开始的时候Black Box是空的.而i等于0。这个Black Box要处理一串命令。

    命令只有两种:

    ADD(x):把x元素放进BlackBox;

    GET:i加1,然后输出Blackhox中第i小的数。

    记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素。例如:

    我们来演示一下一个有11个命令的命令串。(如下图所示)

    现在要求找出对于给定的命令串的最好的处理方法。ADD和GET命令分别最多200000个。现在用两个整数数组来表示命令串:

    1.A(1),A(2),…A(M):一串将要被放进Black Box的元素。每个数都是绝对值不超过2000000000的整数,M$200000。例如上面的例子就是A=(3,1,一4,2,8,-1000,2)。

    2.u(1),u(2),…u(N):表示第u(j)个元素被放进了Black Box里后就出现一个GET命令。例如上面的例子中u=(l,2,6,6)。输入数据不用判错。

    输入输出格式

    输入格式:

    第一行,两个整数,M,N。

    第二行,M个整数,表示A(l)

    ……A(M)。

    第三行,N个整数,表示u(l)

    …u(N)。

    输出格式:

    输出Black Box根据命令串所得出的输出串,一个数字一行。

    输入输出样例

    输入样例#1:
    7 4
    3 1 -4 2 8 -1000 2
    1 2 6 6
    
    输出样例#1:
    3
    3
    1
    2
    

    说明

    对于30%的数据,M≤10000;

    对于50%的数据,M≤100000:

    对于100%的数据,M≤200000。

    分析

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int maxn=2000000+5;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
        return x*f;
    }
    int n,m,heap_size;
    int a[maxn],q[maxn],u[maxn];
    priority_queue<int>q1;
    priority_queue<int,vector<int>,greater<int> >q2;
    int main()
    {
        n=read(); m=read();
        for(int i=1;i<=n;i++) a[i]=read();
        for(int i=1;i<=m;i++)
        {
            int x=read();
            u[x]++;
        }
        int cur=0;
        for(int i=1;i<=n;i++)
        {
            q1.push(a[i]);
            if((int)q1.size()>cur)
            {
                q2.push(q1.top());
                q1.pop();
            }
            while(u[i]--)
            {
                int tmp=q2.top();
                printf("%d
    ",tmp);
                q1.push(tmp);
                q2.pop();
            }
        }
        return 0;
    }
    欢迎转载,转载请注明出处!
  • 相关阅读:
    sql&nbsp;一些语法&nbsp;聚合函数,…
    SQL标准
    margin:auto 和margin:0 auto的区别
    div居中
    相对问题和绝对问题
    有三行文字,每行最多80个字符,求其中大写字母,小写字母,数字,空格和其他
    输入n个字符串,将以A打头的字符串输出
    判断一个字符串是否是回文字符串
    从键盘键入5个国家的名字,按字典序输出
    输入五个字符串,输出最长的字符串
  • 原文地址:https://www.cnblogs.com/huihao/p/7454769.html
Copyright © 2020-2023  润新知