yamake's blog

主に競プロ、たまに自転車

7/23 解いた問題

CODE FESTIVAL 2015 予選A D-壊れた電車

https://atcoder.jp/contests/code-festival-2015-quala/tasks/codefestival_2015_qualA_d

k分でできるかどうかをMについての線形時間で判定できるかつ、k分でできるときk+1分で必ずできる。

この二つの条件がそろっているので二分探索をしたくなります。

 

ARC094 E-Tozan and Gezan

https://atcoder.jp/contests/arc094/tasks/arc094_c

まずa[i] \leq b[i]となるa[i]は全て0になるまで操作をして大丈夫です。

残った山たちについて、b[i]が一番小さいもの以外も0になるまで操作して大丈夫です。

答えは\sum{a[i]} - {min}_{a[i] \gt b[i]}{b[i]}となります。

 

Code Fromula 2014予選A C-決勝進出者

https://atcoder.jp/contests/code-formula-2014-quala/tasks/code_formula_2014_qualA_c

決勝進出者を決める問題です。予選終了時速やかに決勝進出の連絡をするにあたって、まず決勝進出確定の条件について考えます。

 

残りrem人が決勝に進出できるとして、

k番目まで試合を行い、i \quad (i \leq k)番目の試合で最高順位j位を取った人がその試合で決勝進出を決められるかを考えます。

この人が決勝に進出できる条件は「残りの試合でj位より良い順位を取る人がrem人より少ないこと。」です。

残りの試合数はn-k試合で、j位より良い順位はj-1個存在します。

 

従って(n-k)*(j-1) \lt remを満たすとき、i番目の試合でj位を取った人は決勝進出を決めます。

 

試合を行った人たちのデータはheap_queueなどで{ 最高順位、その時のコンテストが何番目のコンテストか }をkeyにして保持するのが楽だと思います。

 

それぞれの試合においてheap_queueが空になるまでwhileを回しても十分間に合います。