题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1261
描述
LT最近一直在无限循环薛之谦的歌,简直都中毒了!可是呢…他的歌LT还是不会唱(其实不止他的歌LT不会唱,所有人的歌LT都不会唱…因为LT是标准的音痴)可是LT又很喜欢唱歌(所以LT不仅是音痴还是音痴)…没错,这对于LT的室友来说简直是噩梦…
现在呢,LT有N次操作,每次操作只会有两种可能:
I a: 表示着LT使用唱歌软件唱歌得到的分数。
Q k: 表示着LT想知道自己得到的第k小的分数是多少。(如果没有第k小,输出-1)
- 输入
- 有多组输入(不超过20组),每组输入的第一行是一个N,表示有N次操作。(0<N<100000)
接下来的2到N+1行每行有一个操作op和一个数字num。op只可能是I或Q,0<=num<1000000 - 输出
- 对于每一个Q操作,输出对应的答案~(~ ̄▽ ̄)~
- 样例输入
-
10 Q 123 I 123 I 32 Q 1 Q 2 Q 2 I 32 Q 1 Q 2 Q 3
- 样例输出
-
-1 32 123 123 32 32 123
这道题不能用sort排序,会超时。C++内置函数upperbound(查找数组的首地址, 查找数组的尾地址, 待查找元素)为logn复杂度的二分查找
返回第一个比待查找元素大的元素地址。
1 #include<algorithm> 2 #include<string.h> 3 #include<stdio.h> 4 #include<iostream> 5 #include<vector> 6 using namespace std; 7 vector<int >G; 8 9 int main() 10 { 11 int t; 12 int s; 13 char str[11]; 14 while(scanf("%d",&t)!=EOF) 15 { 16 G.clear(); 17 int k = 0; 18 while(t--) 19 { 20 scanf("%s%d",str,&s); 21 if(str[0]=='I') 22 { 23 int index = upper_bound(G.begin(),G.end(),s) - G.begin(); 24 G.insert(G.begin()+index,s); 25 } 26 else 27 { 28 int len = G.size(); 29 if(s > len) printf("-1 "); 30 else printf("%d ",G[s-1]); 31 } 32 } 33 } 34 return 0; 35 }