• Black Box POJ1442


    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

    题意:

    给一系列数字,给出前k个数字中第i大的数字,i从1->m;

    题解:

    维护一个从大到小的优先队列和一个从小到大的,大顶堆中存放的是前i-1个数字的最小值,但是会时时更新,小顶堆中存放的是当前的最小值

    此处记录一下改变优先队列的大小顺序的方法,

    1,首先优先队列默认从大到小,大的在顶

    2,从小到大。

    priority_queue<int,vector<int>,greater<int> >//这样便是从小到大
    priority_queue< int,vector<int>,less<int> > //大->小

    3,如果是结构体

    struct number1
    {
        int x;
        bool operator < (const number1 &a) const//只有 < 这个符号
        {
            return x>a.x;//小值优先    //反之大值优先
        }
    };
    

      

      

    //#include <bits/stdc++.h>
    #include <cstdio>
    #include <queue>
    using namespace std;
    const int MAXN=30010;
    priority_queue<int>big;
    priority_queue<int,vector<int>,greater<int> >mi;
    
    int a[MAXN],b[MAXN];
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for (int i = 0; i <n ; ++i) {
            scanf("%d",&a[i]);
        }
        int op;
        int k=0;
        for (int i = 0; i <m ; ++i) {
            scanf("%d",&op);
            while(k<op)
            {
                mi.push(a[k]);
                if(!big.empty()&&mi.top()<big.top())//大顶堆维护前k-1的最小值,小顶堆维护当前除了前k-1个最小值的最小值。
                {
                    int t;
                    t=big.top();
                    big.pop();
                    big.push(mi.top());
                    mi.pop();
                    mi.push(t);
                }
                k++;
            }
            printf("%d
    ",mi.top());//需要把当前的最小值发放入到大顶堆中
            big.push(mi.top());
            mi.pop();
        }
    
        return 0;
    }
    

      

  • 相关阅读:
    121devg笔记 003
    java并发和排序的简单例子(Runnable+TreeSet)
    java的ConCurrentHashMap
    tortoisegit 配置ssh登录
    springboot支持http2
    MySQL数据库远程按日期备份windows脚本
    java web项目 jetty容器启动时,访问.jsp页面失败的问题。
    Oracle解决ora01653 无法通过1024扩展 解决Oracle表空间扩展问题
    vue3 [Vue warn]: onMounted is called when there is no active component instance to be associated with
    vue echarts There is a chart instance already initialized on the dom
  • 原文地址:https://www.cnblogs.com/-xiangyang/p/9468941.html
Copyright © 2020-2023  润新知