AtCoder Beginner Contest 241(Sponsored by Panasonic)のきろく
AtCoder Beginner Contest 241(Sponsored by Panasonic)に参加。
- A - Digit Machine (100点)
- B - Pasta (200点)
- C - Connect 6 (300点、実行時間制限: 3 sec)
- D - Sequence Query (400点)
- E - Putting Candies (500点)
- F - Skate (500点)
- G - Round Robin (600点)
- Ex - Card Deck Score (600点、実行時間制限: 3 sec): 未提出
- 結果、感想
A - Digit Machine (100点)
が答えです。
見にくいので別表記すると として となります。
B - Pasta (200点)
std::map
で各長さの麵の本数を管理すると楽。
C - Connect 6 (300点、実行時間制限: 3 sec)
マス以上が黒であるような連続 マスが存在するとき、答えはYes
、そうでないときNo
となります。
連続 マスは各マスから8方向へ6回探索すればよく、それぞれについて黒マスの数を数えればいいです。
尚、全てのマスについて調べるので8マスのうち半分は調べなくてもいいです((上, 下), (左, 右), (左上, 右下), (右上, 左下)の各組について片方のみでよい)。
斜めについて マスに達してないのにYes
にしてしまうというミスで4WAしました...
D - Sequence Query (400点)
は高々 であるので、std::multiset
やstd::map
で管理したとき、イテレータの移動が高々 回なので、間に合います。
前にbegin()
を超えるかよりも後ろにend()
を超えるかを判定する方が楽だったりするので、 のクエリについては全体に を掛けたもので行うと少し楽になるかも(人に依る?)。
std::multiset
でbegin()
やend()
を超えて操作を行ってしまったコードを出してしまい、1TLEしてしまいました...
E - Putting Candies (500点)
ダブリングを行います。
とします。このとき で割った時の商と余りに注目することで となるので、 を二進数で表した時、 である桁を下から とした時、最初 として を から へ順にを繰り返して、最終的な が答えとなります。本番では各DPの値は (商, 余り) の組として実装しました。
F - Skate (500点)
も も最大で まで取りえるので、全てのマスについて調べることはできません。しかし、途中で立ち寄ることができるマスは障害物の上下左右いずれかの隣接マスのみなのでスタート地点を入れても高々 箇所です。そのため、これらの限定した頂点についてのBFSで答えを求めることができます。
ぶつかる障害物についてはstd::map<int, std:::vector>
での二分探索によって求めることができます。
G - Round Robin (600点)
終了後に解説ACしました。
この解説のとおりに実装しました。
試合からプレイヤーへの辺のうち一方にしか流せないようにすることで一方のみが勝つという状況を表せるのがすごいと思いました。
ちゃんとフローについて勉強しなきゃ...
Ex - Card Deck Score (600点、実行時間制限: 3 sec): 未提出
多項式.... 分かんね...
結果、感想
1700附近まで回復させることができました。でもCの4WAで焦ってしまったのは要反省だなと思いました。