💭

AtCoder Beginner Contest ABC391 解法メモ

に公開

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

ABC391

ABC391A - Lucky Direction

解法

d=["N","NE","E","SE","S","SW","W","NW"]とおけば、
d[(d.find(D)+4) mod 8]が答え

メモ

Copilotに手伝ってもらわないと、誤記が怖い

ABC391B - Seek Grid

解法

a、bを0..N-Mで全探索すればよく、縦横0..<Mで合致するか総当たりすればよい

メモ

特になし

ABC391C - Pigeonhole Query

解法
  • iがどの巣にいるかを持つ配列p
  • どの巣に何羽いるか持つ配列n
  • 2羽以上いる巣の個数を保持する変数(答え)a

を用意してシミュレート
Nimならp=(0..<N).toSeq
n[i]が2に増えるタイミングでa+=1、1に減るタイミングでa-=1

メモ

無駄に怖がって何をどう持つかで混乱し、大いに時間ロス

ABC391D - Gravity

解法

時刻ごとの動きはどうでもよく、全部落ちたときに一行揃うかどうかが問題
一行揃うなら一番遅い(もともと一番上にいた)ブロックが一番下に落ちたタイミングで消える

  • 各列毎の配列x[xi]に(yi,i)の形でブロックを読み込み
  • 各ブロックが下から何層目にいるかを保持する配列a
  • その層の最高位置を保持するためのy
  • その層の個数を保持するc

を用意し、
xをソートしてから、順に

  • a[i]に下から何層目かを保存
  • その層の最高位置を更新 y[a[i]].max=yi
  • その層の個数をインクリメント c[a[i]]+=1

ここまで用意して、クエリ毎に、T<=y[a[A]]か、c[a[A]]<WならYes

メモ

ブロックの挙動の本質から、何をどう持つかが出ない

ABC391E - Hierarchical Majority Vote

解法

操作後の1文字には、もとの3個の要素セットしか影響を及ぼさないので、
初めの文字列Aを(01,その値を変えるための累計コスト(初期値は当然1))の配列に変更して持ったうえで、
普通にN回操作をすればよい
各操作は、

  • 多数決の結果がtupleの前
  • 000か111ならコストの低い方から2つの合計、0か1が2つならどちらかコストの低い方1つがtupleの後

最後のtupleの後が答え

メモ

独立していることに気づかない
1文字ずつコストを管理すればよいことに気づかない


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

Discussion