🕌

AtCoder Beginner Contest ABC406 解法メモ

に公開

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

ABC406

ABC406A - Not Acceptable

解法

(A,B)>(C,D)かどうかみればよい
ACコード

メモ

A>C or (A==C and B>D)かどうかみてもよい

ABC406B - Product Calculator

解法

初期値a=1として、
Aiを順にかけて、10^K以上になったら、
再びa=1にすればよい
ただし、制約が大きいため、そのままではオーバーフローするので、移項して
a<=(10^K-1) div A[i]
かどうか判定すればよい
ACコード

メモ

オーバーフローの確認をしなかった

ABC406C - ~

解法

条件を検討するには、Pの各項の前項との大小(差の正負)がわかればよい
その配列
(1..<N).toSeq.mapIt(P[it]-P[it-1]>0)
を用意すると、
条件を満たすのは、この配列の中の
trueで始まり(条件2)、
途中でfalseになり(条件3)、
またtrueに戻る(条件4)塊のことである
ひとつの塊に対して、
初めのtrueと、終わりのtrueの個数の取り方分だけ別種が作れるので、
種類数は、両trueの個数の積となる
これは、ランレングス圧縮をすれば簡単で、
圧縮後の配列を先頭から一つずつずらしながら、
3項がtrue、false、trueの順になる都度、
両trueの個数の積を足し合わせていけばよい
ACコード

メモ

前項との差をとった数列を作ってしまい、
条件を満たすか判定するステップフラグを用いて実装しようとして手間取った

ABC406D - Garbage Removal

解法

各行、列毎にゴミの位置を保存する配列と、
あわせて行、列毎の個数の合計値を記録する配列を用意しておく
クエリ毎に、まず指定行、列の合計値を答え、
その行、列のゴミの位置で交差する
列、行の合計値を-1(ただし、0のときはそのまま)した上で、
指定行、列の合計値を0にしていけばよい
ACコード

メモ

各行、列のゴミをHashSetで持って忠実に管理してもよいが、ゴミを捨てるときにclearを使うとTLEとなるため、initHashSet[int]()に置きなおすとよい(ACコード
Nimで各行、列のゴミをnewSeq[HashSet[int]](n)で持つとMLEとなるため、Table[int,seq[int]]としておく必要がある


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

Discussion