• Black Box 分类: POJ 栈和队列 2015-08-05 14:07 2人阅读 评论(0) 收藏


    Black Box
    Time Limit: 1000MS Memory Limit: 10000K
    Total Submissions: 8754 Accepted: 3599

    Description
    Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black Box is empty and i equals 0. This Black Box processes a sequence of commands (transactions). There are two types of transactions:

    ADD (x): put element x into Black Box;
    GET: increase i by 1 and give an i-minimum out of all integers containing in the Black Box. Keep in mind that i-minimum is a number located at i-th place after Black Box elements sorting by non- descending.

    Let us examine a possible sequence of 11 transactions:

    Example 1

    N Transaction i Black Box contents after transaction Answer

      (elements are arranged by non-descending)   
    

    1 ADD(3) 0 3

    2 GET 1 3 3

    3 ADD(1) 1 1, 3

    4 GET 2 1, 3 3

    5 ADD(-4) 2 -4, 1, 3

    6 ADD(2) 2 -4, 1, 2, 3

    7 ADD(8) 2 -4, 1, 2, 3, 8

    8 ADD(-1000) 2 -1000, -4, 1, 2, 3, 8

    9 GET 3 -1000, -4, 1, 2, 3, 8 1

    10 GET 4 -1000, -4, 1, 2, 3, 8 2

    11 ADD(2) 4 -1000, -4, 1, 2, 2, 3, 8

    It is required to work out an efficient algorithm which treats a given sequence of transactions. The maximum number of ADD and GET transactions: 30000 of each type.

    Let us describe the sequence of transactions by two integer arrays:

    1. A(1), A(2), …, A(M): a sequence of elements which are being included into Black Box. A values are integers not exceeding 2 000 000 000 by their absolute value, M <= 30000. For the Example we have A=(3, 1, -4, 2, 8, -1000, 2).

    2. u(1), u(2), …, u(N): a sequence setting a number of elements which are being included into Black Box at the moment of first, second, … and N-transaction GET. For the Example we have u=(1, 2, 6, 6).

    The Black Box algorithm supposes that natural number sequence u(1), u(2), …, u(N) is sorted in non-descending order, N <= M and for each p (1 <= p <= N) an inequality p <= u(p) <= M is valid. It follows from the fact that for the p-element of our u sequence we perform a GET transaction giving p-minimum number from our A(1), A(2), …, A(u(p)) sequence.

    Input
    Input contains (in given order): M, N, A(1), A(2), …, A(M), u(1), u(2), …, u(N). All numbers are divided by spaces and (or) carriage return characters.

    Output
    Write to the output Black Box answers sequence for a given sequence of transactions, one number each line.

    Sample Input

    7 4
    3 1 -4 2 8 -1000 2
    1 2 6 6

    Sample Output

    3
    3
    1
    2

    Source
    Northeastern Europe 1996
    题意:共有两种操作,一是添加一个元素,二是输出第i小的元素;
    输入n,m.n代表有n个要添加的元素,m代表操作的个数,
    在m个操作中a[i]=v,表示在第v次添加的时候输出第i小的元素
    方法:用两个优先队列,q2从小到大出对,q1从大到小出对,q1储存的是前i-1小的数据,所以q2的队头就是第i小的数据;

    #include <map>
    #include <list>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define eps 1e-9
    #define LL long long
    #define PI acos(-1.0)
    #define INF 0x3f3f3f3f
    #define CRR fclose(stdin)
    #define CWW fclose(stdout)
    #define RR freopen("input.txt","r",stdin)
    #pragma comment(linker, "/STACK:102400000")
    #define WW freopen("output.txt","w",stdout)
    
    const int MAX = 30010;
    LL a[MAX];
    int b;
    int main()
    {
        int n,m;
        while(~scanf("%d %d",&n,&m))
        {
            priority_queue<LL >q1;
            priority_queue<LL,vector<LL>,greater<LL> >q2;
    
            for(int i=1; i<=n; i++)
            {
                scanf("%lld",&a[i]);
            }
            int k=1;
            for(int i=1; i<=m; i++)
            {
                scanf("%I64d",&b);
                for(; k<=b; k++)
                {
                    if(q1.empty()||q1.top()<a[k])
                    {
                        q2.push(a[k]);
                    }
                    else
                    {
                        q1.push(a[k]);
                        LL ans=q1.top();
                        q1.pop();
                        q2.push(ans);
                    }
                }
                LL ans=q2.top();
                q2.pop();
                printf("%I64d
    ",ans);
                q1.push(ans);
            }
        }
        return 0;
    }
    

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

  • 相关阅读:
    WIN8.1优化
    Iframe跨域嵌入页面自动调整高度的办法
    win8优化
    160多条Windows 7 “运行”命令
    用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠
    system32下 exe文件作用
    html高度百分比分配
    Django启程篇
    自适应网页前端设计相关
    crontab定时任务及jar包等问题
  • 原文地址:https://www.cnblogs.com/juechen/p/4721929.html
Copyright © 2020-2023  润新知