lu100101の日記

勉強の記録

20210522

20210519

  • AtCoder
    • 競プロ典型 90問
      • 005 Restricted Digits
        • 小問題 2
          • 昨日行列計算が遅いと書いたがそれだけじゃなかった
          • ①累乗する行列が間違っていた
            • 解説には「dp[i][j]] -> dp[i+1][k]の遷移が存在する場合に第 j行第 k列が1になる」とあるが、正確には「dp[i][j] -> dp[i+1][k]の遷移が存在する場合に第 j行第 k列を+1する」だった
            • 思考停止よくない
          • ②forループは遅い、行列計算するならnumpy
          • ③numpyはデフォでは初期化時の値にあった型が選ばれる
            • 計算していく中でその型が引き継がれていくから、累乗など小さい値から始まって大きい値になる計算だと簡単にoverflowしてしまう
            • 初期化時にdtype="object"で桁無限のPythonオブジェクト型を指定する
            •  N \times Nの行列同士の積の計算量は一般的には O(N^{3})
        • 小問題 3
          • 思いつくわけないし、解説読んでもよくわからないし、実装もなんか通らない

20210516

  • AtCoder
    • ABC 201
      • D Game in Momotetsu World
        • こういう解法をミニマックス法というらしい(参考
        • 上記実装でも通らなかった
          • REは再帰上限のせい
          • 上限あげると今度はTLE
          • PyPyは再帰が遅く、やめた方がいいらしい
        • 単純にforループでDPを逆向きに進めればいい
    • ARC 118
      • A Tax Included Price
        • math.floor()とかint()ではなく//を使うべき
      • B Village of M People
        • ソートに使う値を愚直に小数にするのではなく整数のままにするだけでよかった
        • 解法が分かっていただけに悔しい
      • とにかく小数を扱うのを避ける!
    • 競プロ典型 90問
      • 001 Yokan Party
        • 答えになりうる値を二分探索という競プロっぽいことができた
      • 002 Encyclopedia of Parentheses
        • itertools.productで全列挙
      • 003 Longest Circular Road
        • 最も長いパス(木の直径というらしい)を探せばよいことは分かったが実装が全然できない
        • 基本的なDFSだしそろそろ身につけたいところ
        • 木の直径を求めるには最短距離の最大値探索を2回やればよい

20210515

  • AtCoder
    • ABC 201
      • C Secret Number
        • 最初、数学的に考えてしまったが、10000通り全探索でいけることに気づけた
        • 最初からその方針で行けてれば10分くらい早かったかも
        • 実装に多少手こずった
      • D Game in Momotetsu World
        • 最適化戦略も分からず、実装も分からないだろうと思い40分以上残して退散
        • 解説を読んで実装してみたがTLE祭り……

20210509

20210505

  • AtCoder
    • 休んでる間のABCとARCの300, 400点問題埋め
      • ABC 199
        • C IPFL
          • listのset itemは O(1)なのを忘れて無理じゃね?と思ってしまった……
          • 反転しているかどうかの情報を保持して T_{i} = 1の時の処理を場合分けで記述する、って確かに当たり前だよなあ
        • D RGB Coloring 2
          • ムズイ、全然わからんかった
          • 参考