题目描述
高橋君はプログラミングコンテストを行い、�N 人の人が参加しました。賞品がないと物足りないのではないかと思った高橋君は「�i 位以上の人のうち、�K 番目に若い人」に特別賞を出すことにしました。参加者全員の年齢は分かっています。�K の値はもう既に決めているのですが、�i の値はまだ決めていません。�i の値を決めるために高橋君は、�K 以上 �N 以下の整数 �i それぞれについて誰が特別賞を取ることが出来るのかを計算してみることにしました。
输入格式
入力は以下の形式で標準入力から与えられる。
�N �K �1X1 �2X2 ... ��XN
- 11 行目には、コンテストに参加した人数を表した整数 � (1 ≦ � ≦ 100,000)N (1 ≦ N ≦ 100,000) と、整数 � (1 ≦ � ≦ �)K (1 ≦ K ≦ N) が空白区切りで与えられる。
- 22 行目には、参加者の年齢の情報を表す �N 個の整数が空白区切りで与えられる。このうち �i 番目の整数 �� (1 ≦ �� ≦ �)Xi (1 ≦ Xi ≦ N) は、順位が �i 位の参加者の年齢が全参加者のうち ��Xi 番目に若いことを表す。ただし、� ≠ �p = q のとき �� ≠ ��Xp = Xq であることが保証される。
输出格式
�−�+1N−K+1 行に出力せよ。そのうち �i 行目には、「�+�−1i+K−1 位以上の人のうち、�K 番目に若い人」の順位を表す 11 つの整数を出力せよ。
题意翻译
给你两个数n,k,输入n个数,输出从第一个数开始的序 列中倒数第k大的数的序号
如样例1 5 2 4 5 3 1 2
输出 2 1 3 5
解释: 在“4,5”的序列中,5为倒数第二大的数,输出“5”的序号2
在“4,5,3”的序列中,4为倒数第二大的数,输出“4”的序号1
在“4,5,3,1”的序列中,3为倒数第二大的数,输出“3”的序号3
在“4,5,3,1,2”的序列中,2为倒数第二大的数,输出“4”的序号5
输入输出样例
输入 #1复制
5 2 4 5 3 1 2
输出 #1复制
2 1 3 5
输入 #2复制
3 1 2 3 1
输出 #2复制
1 1 3
说明/提示
部分点
この問題には部分点が設定されている。
- � ≦ 1000N ≦ 1000 を満たすテストケースすべてに正解した場合は 4040 点が与えられる。
Sample Explanation 1
以下は、出力の各行についての説明です。 - 11 行目: 22 位以上の人のうち 22 番目に若い人は 22 位の人です。 - 22 行目: 33 位以上の人のうち 22 番目に若い人は 11 位の人です。 - 33 行目: 44 位以上の人のうち 22 番目に若い人は 33 位の人です。 - 44 行目: 55 位以上の人のうち 22 番目に若い人は 55 位の人です。
代码如下
#include<iostream>
#include<functional>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
__gnu_pbds::tree<int,__gnu_pbds::null_type,less<int>,__gnu_pbds::rb_tree_tag,__gnu_pbds::tree_order_statistics_node_update> rbt;
int n,k,p[1000001];//p数组存位置
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
int x;
cin>>x;
p[x]=i;
rbt.insert(x);
if(i>=k){
cout<<p[*(rbt.find_by_order(k-1))]<<endl;
}
}
return 0;
}