Joeの精進記録

旧:競プロ練習記録

Codeforces Round #509 (Div. 2)

散々な成績でした。C, 正解者数的にも絶対シンプルなアルゴリズムがあるのに思考を切り替えられなかったです。

codeforces.com

C - Coffee Break

1日目には、 a_iが最小なものから、差を dより大きくして、選べるだけ選びます。選んだものはその都度、setから削除します。 2日目には、残った要素のなかから、同様に差を dより大きくして選べるだけ選びます。 これを繰り返すとできるのですが、set.upper_boundが O(\log n)で動くことを知らなかったため、自らAVL木を実装する羽目に、、、

後日、気合のACです。

Submission #42969399 - Codeforces

冷静に、想定解なわけがなく、 a_iが小さい順に見ていったとき、追加できる日付を順に割り当ててやるとよいです。各日付にすでに割り当てられている最大の a_iを保存しておくだけでいいですね(それが最小な日付に追加すればいいです)。

D - Glider

各上昇気流のスタートから飛び始めるときの答えをそれぞれ計算し、その最大値を取ります。

次以降に通過する各上昇気流のスタートまでにどれだけ下降するかは累積和を用いると O(1)で求められ、さらに着地するまでにどこまで進めるかは二分探索で O(\log n)で求められます。

合わせて O(n\log n)で解けました。