AtCoder Beginner Contest ABC433 解法メモ
文中で使用しているのは、PythonライクでAtCoderに最適な言語の1つNimです
ABC433
ABC433A - Happy Birthday! 4
解法
つまり、
ACコード
メモ
非常に長い年数後まで、実際に
:::
ABC433B - Nearest Taller
解法
答えを
0..<Nの各A[i]につき、先頭から自分の真左まで、自分より背の高い人がいる度に、その番号で更新していけばよい
ACコード
メモ
一人ひとり、自分の真左から先頭まで、自分より背の高い人を順に探していき、いたらその番号を答えていってもよい
ACコード
ABC433C - 1122 Substring 2
解法
連続する数字を固まりで見ていけばよく、
ある固まりの数字から、次の固まりの数字にかけて1が足されていたら、
双方の文字数の少ない方が、その箇所でできるの1122文字列の種類の数といえる
これは、
その後、先頭から次の固まりとの間で、先ほどの確認、計算をしながら、足し合わせていけばよい
ACコード
ABC433D - 183183
解法
A[i]とA[j]を組み合わせると、
A[i]*10^((A[j]).len)+A[j]となる
これが
A[i]*10^((A[j]).len)のmod MとA[j]のmod Mを足した数のmod Mが
事前に、すべてのA[i]対して、10^1..10^10を掛けた、つまりj=1..10に対して、A[i]*10^jをmod Mした数mjとの組(mj,j)の個数をテーブルcにカウントしておけば、
各A[i]に対して、M-(A[i] mod M)となるmiにおけるc[(mi,A[i].len)]を足し合わせていけば答えとなる
ACコード
メモ
事前に10^j別にテーブルでmod Mを求めておく、という発想には至らず、逆元など、計算で対応するものと信じながら時間を溶かした
ABC433E - Max Matrix 2
解法
この問題では、
一旦、各要素をmin(X[i],Y[j])としてみると、
X[i]==Y[j]となるマスは、その値で確定となるが、
同じ値のマスが複数ある箇所については、その中の一箇所にだけその数字を置き、後は、それ以下の数字を置いていくことになるとわかる
この作業をうまく実現するため、
m[min(X[i],Y[j])]=座標を格納していくDeque
を用意し、初めに全マスにわたって格納していく
その際、X[i]==Y[j]であれば、addFirstし、そうでなければaddLastしておく
ここから実際に、
まず、m[i]のDequeからpopFrontした座標に
ここで、まだm[i]に座標が残っていたら、その余りを格納するDeque
降順にみている以上、この際に
ところで、そもそも、
ACコード
メモ
工夫してソートすることで何とかしようとしてしまい、min(X[i],Y[j])の値毎に座標を管理していき、不採用の場合は別に退避しておく、という発想に至らない
ABC433F - 1122 Subsequence 2
解法
求めていく
それはつまり、左側の0..<iの文字の中からS[i]と同じ数字になっている箇所(
これは、(可能であれば)一番短くて、
これをよく観察して言い換えると、
それはつまり、S[i]に対して
その計算にあたっては、各数字の累計和をとっておくとよく、
また、mod 998244353での組合せ計算も用意しておく必要がある
ACコード
メモ
公式解説を読んでも、初め、証明2が何を言っているのかまるでわからなかった
Discussion