ABC267 G - Increasing K Times の計算量について
解説見ても計算量について理解できなかったので、自分なりに考えたものの備忘録。
問題
長さ の整数列 が与えられる。
これを並び替えた数列を として、次の条件を満たすものの総数を で割った余りを求める。ただし、重複する要素は区別する。
・ となる の個数がちょうど 個である。
制約
計算量
DP を次のように定義して、 の要素昇順で並べ方を決める。
個並べているときの、 となる の個数がちょうど 個である並べ方
まず、 の要素がすべて異なる distinct である状態を考える。
このとき、DP テーブルの各マスからの遷移は高々 通りであり、計算量は となる。( 下図参照 )
次に、重複する要素が存在する場合を考える。
distinct であるときの遷移からどう変化するのかを考えてみる。
個並べた数列に新しく追加する要素が 個から 個に増えたとする。
( 一例を下に示す。)
distinct では 行目から 行目への遷移だったものが、 行目から 行目への遷移となる。
このとき、distinct であるときの 行目から 行目への遷移に必要な計算 (最大 回) がなくなり、 行目からの遷移は各マスについて高々 回増える。
ゆえに、重複する要素が発生しても、distinct であるときと比べて計算回数は増えない。
重複が 個以上になっても、 個ずつ重複する要素が増えると考えて、おそらく同じことが言える。
よって、DP の更新の計算量は となる。
雑記
遷移の条件を間違えてドヤ顔で遷移を畳込みにしたら、サンプルすら合わなくて虚無になっていた。
コンテスト中だとナイーブでも計算量大丈夫やろで、無証明提出しそう。
そもそもこの問題を解く人はこんなところで躓かんよな......
最近コンテスト全然解けないので、時間内にここまでいくことがなくて悲しい。
この記事、一ヶ月以上前に書いたまま放置していて震えあがった。
体調崩してた記憶しかねえ......
ここ数日は、珍しくライブラリ整備していた。
永続データ構造と HL 分解を書いてたけど、使うときがくる気がしない。
ところで社会復帰はいつ?