点名
【题目描述】
在J班的体育课上, 同学们常常会迟到几分钟, 但体育老师的点名却一直很准时。
老师只关心同学的身高, 他会依次询问当前最高的身高, 次高的身高, 第三高的身高,
等等。在询问的过程中,会不时地有人插进队伍里。你需要回答老师每次的询问。
【输入格式】
第一行两个整数 n m,表示先后有 n 个人进队,老师询问了 m 次
第二行 n 个整数,第 i 个数 $A_i$ 表示第 i 个进入队伍的同学的身高为 $A_i$
第三行 m 个整数,第 j 个数 $B_j$ 表示老师在第 $B_j$ 个同学进入队伍后有一次询问
【输出格式】
m 行,每行一个整数,依次表示老师每次询问的答案。数据保证合法
【样例输入】
7 4
9 7 2 8 14 1 8
1 2 6 6
【样例输出】
9
9
7
8
【样例解释】
(9){No.1 = 9}; (9 7){No.2 = 9}; (9 7 2 8 14 1){No.3 = 7; No.4 = 8}
【数据范围】
40%的数据保证 $n leq 1000$
100%的数据保证 $1 leq m leq n ≤ 30000;0 leq A_i < 2^{32}$
思路分析:STL set 水过,虽然不是100,但是分数还是很可观的。
set是已排序的...然后就像暴力一样插入元素,看是否需要输出即可。
迭代器的用法:同指针的用法,一样支持++,--。
要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...要用long long...
用multiset...数据有重复,set会爆炸...被卡30分(不读题啊!)
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<set> 4 #define maxn 30010 5 using namespace std; 6 long long n,m,x,c[maxn],a[maxn],cnt; 7 set<long long>miku; 8 set<long long>::iterator hatsune; 9 int main() 10 { 11 #ifndef LOCAL 12 freopen("rollcall.in","r",stdin); 13 freopen("rollcall.out","w",stdout); 14 #endif 15 scanf("%d%d",&n,&m); 16 for(long long i=1; i<=n; i++) 17 scanf("%d",&a[i]); 18 for(long long i=1; i<=m; i++) 19 { 20 scanf("%d",&x); 21 c[x]++; 22 } 23 miku.clear();//不要啊! 24 for(long long i=1; i<=n; i++) 25 { 26 miku.insert(a[i]);//插♂入(怎么回事!)... 27 while(c[i]) 28 { 29 c[i]--; 30 hatsune=miku.begin(); 31 for(long long j=1; j<=cnt; j++) 32 hatsune++; 33 cout<<*hatsune<<endl; 34 cnt++; 35 } 36 } 37 return 0; 38 }
End.