たれながし

色々雑多に書きます

緑diff精進 その1 (1/23)

近況報告

レート4桁になった。 atcoder.jp

ところで最近悲しいくらい精進できていない。就活や研究が若干忙しいせいもあるが、普通に怠惰。

AtcoderProblems Heatmap
ということで水コーダー目指してAtCoder ProblemsのRecommendation (Moderate)を埋めていく日記をつけていくことにする。

あくまで日記なので、解説ではないことに注意してほしい。

あと大嘘担当大臣していたらひっそりと教えてください。

本編 (解いた問題)

  • ABC253 E - Distance Sequence
  • ABC140 D - Face Produces Unhappiness
  • ABC223 D - Restricted Permutation

ABC253 E - Distance Sequence

atcoder.jp

感想 (解答中に考えたこと)

  1.  i番目の要素が決まれば i+1番目の要素の候補がわかるので、DPで解けそう (制約的にもDPっぽい)
  2.  i番目の要素は必ず保持しなければならないので、 dp(i, m):= i番目の要素の大きさがmであるような数列の数
  3. 遷移を考える。 i番目の要素が mである時、 i-1番目の要素は m-K以下か m+K以上であるので

    •  dp(i, m)=\sum_{j=1}^{m-K}dp(i-1, j) + \sum_{j=m+K}^{M}dp(i-1,j)
  4. 1番目の要素は何を選んでも良いので、 dp(0, m)=1

  5. 計算量が O(NM^2)だが、累積和で O(NM)で解ける
  6. 実装するもバグる。ランダムテスト(N, M, K) = (2, 2, 0)の場合に答えがズレている
  7. 3.の式でK=0のとき、 dp(i-1, m)を2回計上しているので、上記の式のままだと面倒な分岐が必要そう
  8. 差を取る方針に変更する
    •  dp(i, m)=\sum_{j=1}^{M}dp(i-1, j) - \sum_{j=m-K+1}^{m+K-1}dp(i-1,j)

提出コード

atcoder.jp

ABC140 D - Face Produces Unhappiness

atcoder.jp

感想 (解答中に考えたこと)

  1. ランレングス圧縮っぽい。とりあえず幸福な人数はsum(c-1 for _, c in T)であることはわかる。
    • ランレングス圧縮後の文字列を T=L_{a}R_{b}L_{c}R_{d}...とした。
  2. 操作前後の評価を慎重に確認してみる。どんなに最適なムーブをしても最大で2ずつしか増えない。
  3.  Tについて、 L_{i}R_{j}といった取り方や端を選択してしまうと嬉しくない。
    • というよりも、 L Rの単一のまとまり かつ 端でないような取り方をするのが一番嬉しいムーブになる。
  4. つまり Tで先頭から順に見た時、末尾でなく先頭の文字と異なる文字が現れる回数が K以下であれば はじめの幸福な人数 + K \times 2、そうでなければ全て同じ方向を向けるので N-1になる
    • 前半の条件がわかりにくい。 T = L_{2}R_{3}L_{1}R_{5}L_{3}R_{1}である場合、先頭の文字が Lなので、異なる文字は3回( R_{3}, R_{5}, R_{1})現れ、うち R_{1}は末尾なので、末尾でなく先頭の文字と異なる文字が現れる回数は2回と言える。

提出コード

atcoder.jp

ABC223 D - Restricted Permutation

atcoder.jp

感想 (解答中に考えたこと)

  1. トポロジカルソートっぽい雰囲気。入次数が0の頂点のうち小さい順に要素を選べば良さそう。
  2. priority_queueでも実装可能っぽいけど、MultiSet(SortedSet 厳密には違うもののはず?)の練習がてら後者で実装する。
  3. SortedSetの中身がなくなるまで最小の要素をappendする。appendした頂点は食べたものとして扱えば、いずれ入次数が0になる頂点が現れるので、その都度SortedSetにaddしていく。
  4. SortedSet遅いんですが…… SortedListに変更して、HashSetで数字を利用したかを管理する。

提出コード

atcoder.jp