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 3HintXiao Ming won't ask Xiao Bao the kth great number when the number of the written number is smaller than k. (1=<k<=n<=1000000).
题意:利用I操作对数列添加加数,利用Q操作查询数列中第k大的数;
因为要对一串数进行询问第k大数的操作,在添加第k个数时,第k大一定是最小的数,之后判断增加的数跟最小的数比较,如果比最小数大那它就是第k大并且这个最小数不再有贡献,否则对于这个数列的第k大数是没有贡献的;
用优先队列进行存储,让大数在队列尾部,最小数在队首,判断进来的数和最小数的大小后,将没有贡献的数pop出去;
开始并没有想到优先队列的窝。。果然对题目的类型不够敏感!
下次碰到数组反复sort一定要想到队列!
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
struct cmp{
bool operator()(int x,int y){
return x>y;
}
};
priority_queue<int,vector<int>,cmp> Q;
int main(){
int n,k;
while(~scanf("%d %d",&n,&k)){
char c;
int num,tot=0,ans=0;
for(int i=1;i<=n;i++){
getchar();
scanf("%c",&c);
if(c=='I'){
scanf("%d",&num);
if(tot>=k){
if(num>Q.top()){
Q.pop();
ans=Q.top();
Q.push(num);
}
else{
ans=Q.top();
}
}
else{
tot++;
Q.push(num);
ans=Q.top();
}
}
else if(c=='Q'){
printf("%d\n",ans);
}
}
while(Q.size()) Q.pop();
}
return 0;
}