1. 程式人生 > >hdu4006 找第k個最大值 優先佇列

hdu4006 找第k個最大值 優先佇列

題意

不斷地向數組裡面加數,然後有多次詢問,每次詢問要求輸出該陣列中第k大的數

陣列長度和詢問次數不超過1e6

思路

此題貌似有多種做法,用樹狀陣列和線段樹也能做.

用優先佇列來做的話,就是維護有k個數的最小堆,每次詢問是將堆頂的數輸出即可

#include<iostream>
#include<algorithm>
#include<queue>
#include<functional>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
    int n,k;
    while(cin>>n>>k){
        while(!q.empty())
            q.pop();
        int Min;
        int num=0;
        for(int i=0;i<n;i++){
            char s;
            cin>>s;
            if(s=='I'){
                int d;
                cin>>d;
                if(num<k){       //先將前k個數放入堆中,形成一個初始堆
                    q.push(d);
                    num++;
                    if(num==k-1)
                        Min=q.top();
                    continue;
                }
                else if(d<=Min){ //如果新的數比堆頂的數字要小,則不用放入堆中
                    continue;
                }
                else{            //否則放入堆中,並將之前最小的數出堆
                    q.push(d);
                    q.pop();
                    Min=q.top();
                }
            }
            if(s=='Q')
                cout<<q.top()<<endl;
        }
    }
    return 0;
}