1007(優先佇列)

聞道-問道發表於2017-08-22

Problem Description
Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to write down a number, or ask Xiao Bao what the kth great number is. Because the number written by Xiao Ming is too much, Xiao Bao is feeling giddy. Now, try to help Xiao Bao.

Input
There are several test cases. For each test case, the first line of input contains two positive integer n, k. Then n lines follow. If Xiao Ming choose to write down a number, there will be an " I" followed by a number that Xiao Ming will write down. If Xiao Ming choose to ask Xiao Bao, there will be a "Q", then you need to output the kth great number.

Output
The output consists of one integer representing the largest number of islands that all lie on one line.

Sample Input
8 3 I 1 I 2 I 3 Q I 5 Q I 4 Q

Sample Output
1 2 3

題目大概:

要求我們求出所給數列的第k大數。

思路:

剛開始,我是用樹狀陣列做的,再加上二分,但是超時了。

因為用二分必須要有序,所以我用了排序,我感覺就是排序超時,但沒找到解決的好辦法,就用了這個優先佇列,畢竟看到這個題,很少有人會想到樹狀陣列。

程式碼:


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>

using namespace std;

struct poin
{
    int v;
    friend bool operator<(poin a,poin b)
    {
        return a.v>b.v;
    }
};

int main()
{
    int n,k;int l;
    poin s;
    while(~scanf("%d%d",&n,&k))
    {
        priority_queue<poin>q;

        char p[2];
        while(n--)
        {


        scanf("%s",p);
        if(p[0]=='I')
        {
            scanf("%d",&l);
            s.v=l;
            q.push(s);
            int t=q.size();
            if(t>k)q.pop();

        }
        else
        {   poin su=q.top();
            printf("%d\n",su.v);
        }
        }
    }

    return 0;
}


相關文章