AtCoder Beginner Contest ABC409 解法メモ

に公開

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

ABC409

ABC409A - Conflict

解法

TiAiが両方'o'であればよい
ACコード

ABC409B - Citation

解法

xは高々Nで、N\leqq100なので、
x=Nを初期値に1ずつ減らしながら、
Ai\geqq xである要素の個数がx個以上であったら、そのxを出力すればよい
ACコード

ABC409C - Equilateral Triangle

解法

入力はすべて整数なので、L mod 3!=0ならば、答えは0
dの初項に0を足してから累積和をとれば、点1からの距離を示す配列になる
各要素のmod Lをとれば、0..<Lの距離で表すことができ、そのCountTableをとれば、各位置での点の個数が出せる
そのCountTableのkeysにL div 3を1回足した位置、2回足した位置もkeysの中にあれば、各valuesをかけ合わせただけの正三角形の組み合わせがあるといえる
その総和が答え
ACコード

ABC409D - String Rotation

解法

Sを頭から見ていき、
i文字目が次の文字より大きければi文字目から巡回シフトした方がよく」
その巡回シフトは、
i文字目が、i<jなるj文字目より小さくなる手前(そうならなければ最後)まで行うとよい」
NimではrotatedLeft(1)が使える
ACコード

ABC409E - Pair Annihilation

解法

ある葉のxi0でない限り、必ずそれを結ぶ辺を通る
同様に、根付き木としてみれば、ある辺から先の部分木は、中に含むxiの合計(プラスマイナス相殺)分、その辺を通る
DFSをしながら、その絶対値と重みとの積を数えていけばよい
具体的には、DFSの返り値をxiの合計値として、
親に向かう以外の辺すべてにわたって加えながら、
同時にそれらの絶対値にwjをかけたものを答えに加えていく
最後、帰りに自分自身のxiを足せばよい
ACコード

メモ

2点間の重みの最小値を求めることにこだわり、425点にもかかわらず、オイラーツアーだの、ダブリングだのと思い悩んだ
それが求められたところで、どの道、この制約では重みの最小値から貪欲に計算していくことはできないのではないか、と思ったものの、正解の解法には至らなかった


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

Discussion