Official

F - Tournament Editorial by nok0


問題文のトーナメントは、深さ \(N\) の完全二分木上で試合を行っているとみることが出来ます。

ここで、以下のような DP を考えます。

\(\mathrm{DP}[i][j]\coloneqq\) 完全二分木のノード \(i\) において、人 \(j\) が勝ち上がっているときの、これまでノード \(i\) の子ノードで負けた人が貰うお金の合計の最大値。

はじめに状態数を見積もります。ノード数が \(\mathrm{O}(2^N)\) であり、\(j\) の添え字は最大で \(\mathrm{O}(2^N)\) 種類取り得るので、状態数は \(\mathrm{O}(2^{2N})\) に見えるかもしれません。

しかし、深さが同じノードを見ると合計で \(j\) の添え字が \(\mathrm{O}(2^N)\) 種類であり、深さが \(O(N)\) なことから、状態数は\(\mathrm{O}(N2^{N})\) であり、配列で持てる程度に十分小さいです。

遷移を考えます。

\(\mathrm{DP}[l][j]\)\(\mathrm{DP}[r][k]\) をマージして親ノードを更新するとき、\(j\)\(k\) を全探索すると計算量が厳しいです。しかし、\(l\) 側の人が勝つとすると、\(r\) 側で獲得するお金の合計の最大値は \(j\) に依存しないので、前計算で \(r\) 側で獲得するお金の合計の最大値を求めておくことで、 \(k\) 側を全探索する必要がなくなり、遷移が高速化できます。(\(r\) 側が勝つ場合も全く同様です。)

以上の工夫により、結局遷移の合計の計算量が \(\mathrm{O}(N2^{N})\) になります。これは十分高速です。

posted:
last update: