SlideShare a Scribd company logo
1 of 15
+ 
AtCoderRegular28B 
ICPC AOJ Meeting 2014/11/17
+ 
Problem 
 高橋君はプログラミングコンテストを行い、N 人の人が参加し 
ました。賞品がないと物足りないのではないかと思った高橋君 
は「i 位以上の人のうち、K 番目に若い人」に特別賞を出すこ 
とにしました。参加者全員の年齢は分かっています。K の値は 
もう既に決めているのですが、i の値はまだ決めていません。 
i の値を決めるために高橋君は、K 以上N 以下の整数i それぞ 
れについて誰が特別賞を取ることが出来るのかを計算してみる 
ことにしました。
+ 
I/O 
 入力は以下の形式で標準入力から与えられる。 
N K X1 X2 ... XN 
 1 行目には、コンテストに参加した人数を表した整 
数N(1≦N≦100,000) と、整数K(1≦K≦N) が空白区切りで与え 
られる。 
 2 行目には、参加者の年齢の情報を表すN 個の整数が空白区切 
りで与えられる。このうちi 番目の整数Xi(1≦Xi≦N) は、順位 
がi 位の参加者の年齢が全参加者のうちXi 番目に若いことを 
表す。ただし、p≠q のときXp≠Xq であることが保証される。 
 N−K+1 行に出力せよ。そのうちi 行目には、「i+K−1 位以上の 
人のうち、K 番目に若い人」の順位を表す1 つの整数を出力せ 
よ
+ 
SourceCode 
public class Main { 
public static void main(String[] args) { 
Scanner sc = new Scanner(System.in); 
String[] strs = sc.nextLine().split(" "); 
int n = Integer.parseInt(strs[0]); 
int k = Integer.parseInt(strs[1]); 
strs = sc.nextLine().split(" "); 
new VeryFastExecution(strs,k); 
} 
}
+ class Execution { 
private Person[] persons; 
public Execution(String[] data) { 
persons = mapper(intArrayParser(data)); 
} 
public int askRank(int targetRank, int targetPerson) { 
ArrayList<Person> tmp = filter(persons, targetRank); 
Collections.sort(tmp, new Comparator<Person>() { 
@Override 
public int compare(Person o1, Person o2) { 
return o1.index - o2.index; 
} 
}); 
return tmp.get(targetPerson - 1).rank; 
}
+ 
private int[] intArrayParser(String[] strs) { 
int[] arr = new int[strs.length]; 
for (int i = 0; i < arr.length; i++) { 
arr[i] = Integer.parseInt(strs[i]); 
} 
return arr; 
} 
private Person[] mapper(int[] data) { 
Person[] persons = new Person[data.length]; 
for (int i = 0; i < data.length; i++) { 
persons[i] = new Person(i + 1, data[i]); 
} 
return persons; 
} 
private ArrayList<Person> filter(Person[] data, int target) { 
ArrayList<Person> tmp = new ArrayList<>(); 
for (Person p : data) { 
if (p.rank <= target) { 
tmp.add(p); 
} 
} 
return tmp; 
} 
}
+
+ 
遅い 
遅い
+ 
高速化しよう 
private ArrayList<Person> filter(Person[] data, int target) { 
ArrayList<Person> tmp = new ArrayList<>(); 
for (Person p : data) { 
if (p.rank <= target) { 
tmp.add(p); 
} 
} 
return tmp; 
} 
System.arraycopy(persons, 0, tmp, 0, targetRank); 
Person配列を順位でフィルタリングする処理を 
System.arraycopyに置き換え 
ネイティブメソッドだから速いはず
+
+ 
遅い 
遅い
+ 
優先順位付きQueue 
 優先順位付きQueueとは挿入されたオブジェクトを指定した優 
先順位で並べ替えるQueue 
 要素を追加する、要素の最も大きな値を取り出すという操作だ 
けを行う 
 C++の解説サイトだがココらへんが詳しい 
http://futurismo.biz/archives/1981
+private void calculation(){ 
Comparator<Integer> cp = new Comp(); 
Queue<Integer> queue = new PriorityQueue<>(1, cp); 
int[] ranker = new int[persons.length]; 
int[] rank = new int[persons.length + 1]; 
for (int i = 0; i < persons.length; i++) { 
ranker[i] = persons[i].index; 
rank[ranker[i]] = persons[i].rank; 
if (i < k) { 
queue.add(ranker[i]); 
} 
} 
for (int i = k; i < persons.length; i++) { 
int next = queue.poll(); 
if (ranker[i] < next) { 
queue.add(ranker[i]); 
} else { 
queue.add(next); 
} 
System.out.println(rank[next]); 
} 
int next = queue.poll(); 
System.out.println(rank[next]); 
} 
Person[]にデータを追加したあとで 
このメソッドを実行する
+
+ 
ideone 
http://ideone.com/TKvOsq

More Related Content

Viewers also liked

Testing with Style @ Holidaycheck
Testing with Style @ HolidaycheckTesting with Style @ Holidaycheck
Testing with Style @ HolidaycheckAndreas Neumann
 
La dominación francesa en arcos y su comarca.orig.
La dominación francesa en arcos y su comarca.orig.La dominación francesa en arcos y su comarca.orig.
La dominación francesa en arcos y su comarca.orig.mgarruchojurado
 
Flexible payment house and lot in cavite 100% flood free (townhouse, single d...
Flexible payment house and lot in cavite 100% flood free (townhouse, single d...Flexible payment house and lot in cavite 100% flood free (townhouse, single d...
Flexible payment house and lot in cavite 100% flood free (townhouse, single d...Queenie Samonte
 
Engr 213 midterm 2a 2009
Engr 213 midterm 2a 2009Engr 213 midterm 2a 2009
Engr 213 midterm 2a 2009akabaka12
 
OGD new generation infrastructures evaluation based on value models
OGD new generation infrastructures evaluation based on value modelsOGD new generation infrastructures evaluation based on value models
OGD new generation infrastructures evaluation based on value modelsCharalampos Alexopoulos
 
Origen fiestas agostinas San Salvador, ES
Origen fiestas agostinas San Salvador, ESOrigen fiestas agostinas San Salvador, ES
Origen fiestas agostinas San Salvador, ESGabriela Garcia
 

Viewers also liked (8)

MIT WEB
MIT WEBMIT WEB
MIT WEB
 
Testing with Style @ Holidaycheck
Testing with Style @ HolidaycheckTesting with Style @ Holidaycheck
Testing with Style @ Holidaycheck
 
La dominación francesa en arcos y su comarca.orig.
La dominación francesa en arcos y su comarca.orig.La dominación francesa en arcos y su comarca.orig.
La dominación francesa en arcos y su comarca.orig.
 
Flexible payment house and lot in cavite 100% flood free (townhouse, single d...
Flexible payment house and lot in cavite 100% flood free (townhouse, single d...Flexible payment house and lot in cavite 100% flood free (townhouse, single d...
Flexible payment house and lot in cavite 100% flood free (townhouse, single d...
 
Engr 213 midterm 2a 2009
Engr 213 midterm 2a 2009Engr 213 midterm 2a 2009
Engr 213 midterm 2a 2009
 
Voladura - Accesorios
Voladura - AccesoriosVoladura - Accesorios
Voladura - Accesorios
 
OGD new generation infrastructures evaluation based on value models
OGD new generation infrastructures evaluation based on value modelsOGD new generation infrastructures evaluation based on value models
OGD new generation infrastructures evaluation based on value models
 
Origen fiestas agostinas San Salvador, ES
Origen fiestas agostinas San Salvador, ESOrigen fiestas agostinas San Salvador, ES
Origen fiestas agostinas San Salvador, ES
 

More from nullzine

第二回ミーティングスライド
第二回ミーティングスライド第二回ミーティングスライド
第二回ミーティングスライドnullzine
 

More from nullzine (12)

Meeting19
Meeting19Meeting19
Meeting19
 
Meeting18
Meeting18Meeting18
Meeting18
 
Meeting13
Meeting13Meeting13
Meeting13
 
Meeting11
Meeting11Meeting11
Meeting11
 
Meeting10
Meeting10Meeting10
Meeting10
 
Meeting9
Meeting9Meeting9
Meeting9
 
Meeting8
Meeting8Meeting8
Meeting8
 
Meeting7
Meeting7Meeting7
Meeting7
 
Meeting6
Meeting6Meeting6
Meeting6
 
Meeting5
Meeting5Meeting5
Meeting5
 
第二回ミーティングスライド
第二回ミーティングスライド第二回ミーティングスライド
第二回ミーティングスライド
 
Meeting1
Meeting1Meeting1
Meeting1
 

Meeting12

  • 1. + AtCoderRegular28B ICPC AOJ Meeting 2014/11/17
  • 2. + Problem  高橋君はプログラミングコンテストを行い、N 人の人が参加し ました。賞品がないと物足りないのではないかと思った高橋君 は「i 位以上の人のうち、K 番目に若い人」に特別賞を出すこ とにしました。参加者全員の年齢は分かっています。K の値は もう既に決めているのですが、i の値はまだ決めていません。 i の値を決めるために高橋君は、K 以上N 以下の整数i それぞ れについて誰が特別賞を取ることが出来るのかを計算してみる ことにしました。
  • 3. + I/O  入力は以下の形式で標準入力から与えられる。 N K X1 X2 ... XN  1 行目には、コンテストに参加した人数を表した整 数N(1≦N≦100,000) と、整数K(1≦K≦N) が空白区切りで与え られる。  2 行目には、参加者の年齢の情報を表すN 個の整数が空白区切 りで与えられる。このうちi 番目の整数Xi(1≦Xi≦N) は、順位 がi 位の参加者の年齢が全参加者のうちXi 番目に若いことを 表す。ただし、p≠q のときXp≠Xq であることが保証される。  N−K+1 行に出力せよ。そのうちi 行目には、「i+K−1 位以上の 人のうち、K 番目に若い人」の順位を表す1 つの整数を出力せ よ
  • 4. + SourceCode public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] strs = sc.nextLine().split(" "); int n = Integer.parseInt(strs[0]); int k = Integer.parseInt(strs[1]); strs = sc.nextLine().split(" "); new VeryFastExecution(strs,k); } }
  • 5. + class Execution { private Person[] persons; public Execution(String[] data) { persons = mapper(intArrayParser(data)); } public int askRank(int targetRank, int targetPerson) { ArrayList<Person> tmp = filter(persons, targetRank); Collections.sort(tmp, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.index - o2.index; } }); return tmp.get(targetPerson - 1).rank; }
  • 6. + private int[] intArrayParser(String[] strs) { int[] arr = new int[strs.length]; for (int i = 0; i < arr.length; i++) { arr[i] = Integer.parseInt(strs[i]); } return arr; } private Person[] mapper(int[] data) { Person[] persons = new Person[data.length]; for (int i = 0; i < data.length; i++) { persons[i] = new Person(i + 1, data[i]); } return persons; } private ArrayList<Person> filter(Person[] data, int target) { ArrayList<Person> tmp = new ArrayList<>(); for (Person p : data) { if (p.rank <= target) { tmp.add(p); } } return tmp; } }
  • 7. +
  • 9. + 高速化しよう private ArrayList<Person> filter(Person[] data, int target) { ArrayList<Person> tmp = new ArrayList<>(); for (Person p : data) { if (p.rank <= target) { tmp.add(p); } } return tmp; } System.arraycopy(persons, 0, tmp, 0, targetRank); Person配列を順位でフィルタリングする処理を System.arraycopyに置き換え ネイティブメソッドだから速いはず
  • 10. +
  • 12. + 優先順位付きQueue  優先順位付きQueueとは挿入されたオブジェクトを指定した優 先順位で並べ替えるQueue  要素を追加する、要素の最も大きな値を取り出すという操作だ けを行う  C++の解説サイトだがココらへんが詳しい http://futurismo.biz/archives/1981
  • 13. +private void calculation(){ Comparator<Integer> cp = new Comp(); Queue<Integer> queue = new PriorityQueue<>(1, cp); int[] ranker = new int[persons.length]; int[] rank = new int[persons.length + 1]; for (int i = 0; i < persons.length; i++) { ranker[i] = persons[i].index; rank[ranker[i]] = persons[i].rank; if (i < k) { queue.add(ranker[i]); } } for (int i = k; i < persons.length; i++) { int next = queue.poll(); if (ranker[i] < next) { queue.add(ranker[i]); } else { queue.add(next); } System.out.println(rank[next]); } int next = queue.poll(); System.out.println(rank[next]); } Person[]にデータを追加したあとで このメソッドを実行する
  • 14. +