公式

G - Avoid Straight Line 解説 by cn449


頂点 \(v\) に対して、\(x\)\(y\)同じ側にあることを \(v\)\(x\) を結ぶ単純パスと \(v\)\(y\) を結ぶ単純パスが共通した \(v\) でない頂点を含む、あるいは \(x = v\) または \(y = v\) を満たすことと定義します。

頂点 \((i,j,k)\) をすべて含む単純パスが存在しないとします。このとき、\(i\) に対して \(j,k\) は同じ側で、同様に \(j\) に対して \(k,i\) は同じ側、\(k\) に対して \(i,j\) は同じ側です。したがって、ある頂点 \(v\) が一意に存在して、\(i,j,k\) から異なる \(2\) 頂点を選んだとき、それらは \(v\) に関して同じ側ではありません。逆に、\((i,j,k)\) をすべて含む単純パスが存在するとき、そのような \(v\) は存在しません。

よって、\(v = 1,2, \ldots, N\) に対して \(i,j,k\) から異なる \(2\) 頂点を選んだときにそれらが \(v\) に関して同じ側ではないような \((i,j,k)\) の組の個数を求め、足し合わせればよいです。

\(v\) を固定したときの答えを考えます。\(v\) を根として木を根付き木とし、\(v\) の子を \(w_1, w_2, \ldots, w_n\) とします。\((i,j,k)\) が条件を満たすことは相異なる \((i', j', k')\) が存在して \(i\)\(w_{i'}\) を根とする部分木の頂点、\(j\)\(w_{j'}\) を根とする部分木の頂点、\(k\)\(w_{k'}\) を根とする部分木の頂点となることと同値です。したがって、\(w_l\) を根とする部分木の頂点数を \(c_l\) とすると、答えは相異なる \((i', j', k')\) に対する \(c_{i'}c_{j'}c_{k'}\) の和です。
よって数列 \(c\) が与えられたときに異なる \(3\) 要素の積の和が求められればよく、これは \(dp_{i,j}\)\(i\) 番目までから異なる \(j\) 要素を選んだときの積の和とし計算することにより \(O(|c|)\) で求められます(多項式を用いた数え上げの議論に慣れている方は、\([x^3] \displaystyle \prod (c_ix+1)\) と考えても簡明でしょう)。

以上より \(v\) を固定したときの問題が解けました。必要な情報は \(v\) を根付き木としたときの \(v\) の各子を根とする部分木の頂点数だけだったので、これは適当な頂点を根とする部分木をとり、各頂点を根とする部分木の頂点数を木 dp により求めることにより十分高速に得られます。頂点 \(v\) に関する計算は \(v\) の次数を \(d(v)\) として \(O(d(v))\) でできたので、全体として時間計算量 \(O(N)\) でこの問題が解けました。

投稿日時:
最終更新: