HDU 4006 The kth great number(优先队列)

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
Hint
Xiao 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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值