hdu4006 找第k個最大值 優先佇列
阿新 • • 發佈:2019-02-04
題意
不斷地向數組裡面加數,然後有多次詢問,每次詢問要求輸出該陣列中第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; }