近況報告
レート4桁になった。 atcoder.jp
ところで最近悲しいくらい精進できていない。就活や研究が若干忙しいせいもあるが、普通に怠惰。 ということで水コーダー目指してAtCoder ProblemsのRecommendation (Moderate)を埋めていく日記をつけていくことにする。
あくまで日記なので、解説ではないことに注意してほしい。
あと大嘘担当大臣していたらひっそりと教えてください。
本編 (解いた問題)
- ABC253 E - Distance Sequence
- ABC140 D - Face Produces Unhappiness
- ABC223 D - Restricted Permutation
ABC253 E - Distance Sequence
感想 (解答中に考えたこと)
- 番目の要素が決まれば番目の要素の候補がわかるので、DPで解けそう (制約的にもDPっぽい)
- 番目の要素は必ず保持しなければならないので、
遷移を考える。番目の要素がである時、番目の要素は以下か以上であるので
1番目の要素は何を選んでも良いので、
- 計算量がだが、累積和でで解ける
- 実装するもバグる。ランダムテスト(N, M, K) = (2, 2, 0)の場合に答えがズレている
- 3.の式でのとき、を2回計上しているので、上記の式のままだと面倒な分岐が必要そう
- 差を取る方針に変更する
提出コード
ABC140 D - Face Produces Unhappiness
感想 (解答中に考えたこと)
- ランレングス圧縮っぽい。とりあえず幸福な人数は
sum(c-1 for _, c in T)
であることはわかる。- ランレングス圧縮後の文字列をとした。
- 操作前後の評価を慎重に確認してみる。どんなに最適なムーブをしても最大で2ずつしか増えない。
- について、といった取り方や端を選択してしまうと嬉しくない。
- というよりも、やの単一のまとまり かつ 端でないような取り方をするのが一番嬉しいムーブになる。
- つまりで先頭から順に見た時、末尾でなく先頭の文字と異なる文字が現れる回数が以下であれば、そうでなければ全て同じ方向を向けるのでになる
- 前半の条件がわかりにくい。である場合、先頭の文字がなので、異なる文字は3回()現れ、うちは末尾なので、
末尾でなく先頭の文字と異なる文字が現れる回数
は2回と言える。
- 前半の条件がわかりにくい。である場合、先頭の文字がなので、異なる文字は3回()現れ、うちは末尾なので、
提出コード
ABC223 D - Restricted Permutation
感想 (解答中に考えたこと)
- トポロジカルソートっぽい雰囲気。入次数が0の頂点のうち小さい順に要素を選べば良さそう。
- priority_queueでも実装可能っぽいけど、MultiSet(SortedSet 厳密には違うもののはず?)の練習がてら後者で実装する。
- SortedSetの中身がなくなるまで最小の要素をappendする。appendした頂点は食べたものとして扱えば、いずれ入次数が0になる頂点が現れるので、その都度SortedSetにaddしていく。
- SortedSet遅いんですが…… SortedListに変更して、HashSetで数字を利用したかを管理する。