💬

AtCoder Beginner Contest ABC426 解法メモ

に公開

文中で使用しているのは、PythonライクでAtCoderに最適な言語の1つNimです

ABC426

ABC426A - OS Versions

解法

"Ocelot", "Serval", "Lynx"を配列とし、
XYそれぞれをfindして比較すればよい
ACコード

ABC426B - The Odd One Out

解法

SのCountTableをとり、
valueが1のkeyを答えればよい
ACコード

メモ

Yes、Noだけと思い込み、toCountTableなどを始めてしまった

ABC426C - Upgrade Required

解法

Xi以下の台数合計が計算できれば、Yiの台数に足し合わせることを繰り返していけばよい
次のXi以下の台数合計の計算の際には、これまでのXiの最高値m以下のバージョンは存在しないことを考えれば、
m以下の部分は無視して)mより大きく、Xi以下の台数の合計を計算して答え、それをYiに足していけばよい(Xim以下なら当然0台)
これはフェニック木fを使えば簡単で、初めのバージョンの台数と合わせて
a=Xi-m+f[m+1..Xi]
としてaを出力し、
f.add(Yi,a)
とすればよい
ACコード

メモ

バージョンはXiの最高値mを下限に上がっていくだけなので、単純にシミュレートしたところでTLEにはならない
ACコード

ABC426D - Pop and Insert

解法

Sをいくつかの01の塊が続いている状態と捉え直す
仮に、すべてを0にしようとした場合、
操作が可能な両端に1の塊があれば、操作によって、既存の0の塊と合体することができる
一方、両端に0の塊があった場合、操作によって、既存の1の塊と合体することができ、その後、いつかその塊が端に来た際に、改めて操作によって他の0の塊と合体することができる、すなわち、2回の操作が必要とわかる
合体先となる0の塊はどれでもよく、その塊には操作が不要なので、最も長い塊を選んで、それに合体していけばよい
つまり、ランレングス圧縮して、
すべて0にしようとして、(1の塊の長さ合計)\times 1+(02番目に長い塊以降の長さ合計)\times 2
と、
すべて1にしようとして、(0の塊の長さ合計)\times 1+(12番目に長い塊以降の長さ合計)\times 2
の、小さな方が答え
この考え方は、そもそも1種類しかなかったり、各々1塊ずつしかないといったケースでも一般性を失わない
ACコード

メモ

なぜか初めに「中央」にこだわってしまい、中央から左右端に向けて1個か2個ずつ足していけばよい、と誤認してしまった

ABC426E - Closest Moment

解法

各スタート地点からのt秒後の位置を算出し、その2点間の距離をtで表せるようにした上で、三分探索すればよい
ただし、どちらかがゴールに到達して停止してしまうことで、tの推移による2点間の距離は極小点が1つになるとはいえなくなる
よって、「スタートからどちらかがゴールするまで」と、
「そこから両方がゴールするまで」に時間を分け、
各々で三分探索して最小値を求め、その2つの最小値を答えればよい
ACコード

メモ

片方が止まろうと極小値は1つだろうと高を括り、無理に2点間距離をシミュレートしたが、ほとんどがWAとなった


反復学習にはmochiがおすすめ
全問入ったdeckはこちら

Discussion