A | B | C | D | E | F | |
問題文 | ■ | ■ | ■ | ■ | ■ | ■ |
自分の提出 | ■ | ■ | ■ | ■ | ■ | ■ |
結果 | AC | AC | AC | AC | MLE | AC |
E コンテスト後 AC → https://atcoder.jp/contests/m-solutions2020/submissions/15454058
全体感想
44分5完で、97位でした。
Eでやられてしまいました。MLE は古い過去問で経験がありますが、メモリ制限が 64~256MB などの小さい場合のことが多く。
最近のコンテストでは通常 1024MB 制限となっていますが、1024MB 制限で MLE した経験は全くなかったですし、リアルタイム参加したコンテストで MLE のせいで AC できなかったのは今回が初めてです。勉強になりました。
問題E – M’s Solution
改めて、
コンテスト翌日ですが、
各人が最適に動くなかでの最小値ですが、まずは「縦の距離、横の距離のうち好きなほうを選べる」とした上での最小値と言い換えます。ありがち。
そこで、各人が横の移動、縦の移動のどちらを受け持つのかを決め打ってしまった上で、になるのかを割り振る(
座標
ソートしておきます。最適解は、
人
各
以上を実装しようとすると、
問題F – Air Safety
発想はほとんど必要なく、いかにバグらせにくく手早く実装できるかが問われる問題だと思います。それを含めても、問題Eよりも簡単に感じました。AC人数もこちらの方が多かったようです。
UとDの衝突の場合
でソート- 各 U 方向の
に対して、1. の意味で最寄りの を探す ならば衝突。その場合の衝突時間は
という要領で計算できます。
LとRの衝突も同様です。
UとRの衝突について考えましょう。
が成り立つときです。この連立方程式を解くと、
- (U,D)の場合:
- (U,R)の場合:
などとすれば、「
6種とも同様のロジックで、衝突の有無・最短時間が計算できることが分かったので、あとはその計算をする関数を用意して、6 回呼び出す形で実装すると、多かれ少なかれ十分に簡潔に済むと思います。