DOJ logoDOJ
問題
最近追加された問題保存した問題Workbooks
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord認証を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

KMO

問題に戻る

解説

木への変換

KKK 種類の記号を使う接頭語符号の符号長はクラフトの不等式 ∑K−bi≤1\sum K^{-b_i}\leq1∑K−bi​≤1 を満たし、逆も成り立つ。長さを昇順に処理し、未使用の位置を次の深さで KKK 個に分岐させて必要な葉を置けば、対応する木を構成できる。

よって、各内部頂点の子が高々 KKK 個の根付き木において、葉の重みと深さの積の総和を最小化する問題になる。重み 000 の入力要素も実際の葉なので削除してはならない。

ハフマン併合

N=1N=1N=1 なら 000 を出力する。それ以外では、各内部頂点がちょうど KKK 個の子を持つ木の葉数は、K−1K-1K−1 で割ると 111 余る。重み の仮想的な葉を

d=(K−1−(N−1) mod (K−1)) mod (K−1)d=(K-1-(N-1)\bmod(K-1))\bmod(K-1)d=(K−1−(N−1)mod

個追加する。最適な木の子が一つだけの頂点を取り除き、子が KKK 個未満の内部頂点を最深部にまとめて一つだけにすれば、足りない位置を埋める葉数は ddd 個になる。非負の重みを持つ葉を浅く移しても費用は増えないため、最適値は変わらない。

浅い位置にある軽い葉と深い位置にある重い葉を交換しても費用は増えない。したがって、重みが小さい KKK 個の葉が最深部で同じ親を持つ最適解が存在する。この KKK 個を、重みが総和である一つの葉に縮約する。元の費用は縮約後の費用にその総和を加えたものとなる。これを繰り返すのが KKK 分ハフマン法である。

仮想的な葉は実際に作る必要がない。最初だけ

r=2+(N−2) mod (K−1)r=2+(N-2)\bmod(K-1)r=2+(N−2)mod(K−1)

個の実際の頂点を併合し、その後は毎回 KKK 個ずつ併合する。K>NK>NK>N なら r=Nr=Nr=N となる。N−1N-1N−1 が の倍数なら最初も 個を併合する点に注意する。

最小ヒープで頂点を取り出し、新しい頂点をそれらの親として記録する。親の番号は子より大きいので、番号の逆順に深さを計算でき、再帰は不要である。元の入力順に葉の深さを出力する。

内部頂点は高々 N−1N-1N−1 個で、それぞれ二つ以上の子を持つため、深さは N−1N-1N−1 以下である。時間計算量は O(Nlog⁡N)O(N\log N)O(NlogN)、空間計算量は O(N)O(N)。併合重みは 以下である。すべての深さを とする解が存在するので、最適費用は 以下となる。符号付き ビット整数で十分であり、 を直接計算する必要はない。

サブタスク 1 は重みを降順に並べ、000 から N−1N-1N−1 までの非減少な深さ列を全列挙する。交換論法により、この順序の最適解が存在する。列は (2N−1N)\binom{2N-1}{N}(N2N−1​ 個あり、各列を で確認できる。サブタスク 2 は二分ハフマン法で毎回最小の二つを併合し、 で解ける。

不等式の検査では深さ 000 の空き位置を一つとし、その深さの葉数を引いてから KKK 倍する。葉数が空き位置を超えたら不正である。葉は合計 NNN 個なので位置数を N+1N+1N+1 で打ち切ってよい。費用の検査では最適値を残り予算とし、積を計算する前に除算で予算超過を判定する。これにより誤った出力によるオーバーフローも防げる。

Solution written by GPT6

00
0
(K−
1))mod
(K−
1)
K−1K-1
K−1
KKK
O(N)
2⋅10142\cdot10^{14}2⋅1014
⌈log⁡KN⌉\lceil\log_K N\rceil⌈logK​N⌉
3.6⋅10153.6\cdot10^{15}3.6⋅1015
646464
KbiK^{b_i}Kbi​
)
O(N)O(N)O(N)
O(Nlog⁡N)O(N\log N)O(NlogN)