Ex - Balanced Tree Editorial by kyopro_friends

正誤判定プログラムの実装

この問題の正誤判定方法を考えます。

正確な問題は次の通りです:
\(N\) 頂点の木 \(T\)\(N\) 頂点の根付き木 \(R\) が与えられます。いずれも頂点には \(1\)\(N\) の番号がついています。次の条件をともに満たすか判定してください。

  • \(1\leq x< y \leq N\)を満たす全ての整数の組 \((x,y)\) について、\(R\) における \({\rm LCA}(x,y)\)\(T\) における \(x\) - \(y\) パス上にある
  • \(R\) の根以外の全ての頂点 \(v\) について、(\(v\) の部分木のサイズ) \(\times 2 \leq \) (\(v\) の親の部分木のサイズ) を満たす

まず \(2\) 番目の条件を満たすか判定します。これは \(O(N)\) で容易に確かめられます。\(2\) 番目の条件を満たす場合に限り、\(1\) 番目の条件を満たすかどうか判定することにします。

\(1\) 番目の条件を次の通り読み替えるための準備をします。

  • \(R\) において、\(x,y\neq v\) かつ \({\rm LCA}(x,y)=v\) である \(\Longleftrightarrow\) \(R\) において、\(x,y\)\(v\) の子の異なる部分木に属する
  • \(T\) において、\(x,y\neq v\) かつ \(v\)\(x\) - \(y\) パスに属する \(\Longleftrightarrow\) \(T\) において \(v\) を根としたとき、\(x,y\)\(v\) の子の異なる部分木に属する

このことから、\(1\) 番目の条件が成り立つことを示すには \(R\) の各頂点 \(v\) に対して、\(v\) の異なる子の部分木に含まれる頂点が、\(T\) においてもそうであることを示せば十分です。

これはさらに、\(R\)\(v\) の各子の部分木について、「各頂点が \(T\) において \(v\) のどの子の部分木に属するか」を求め、これらのなす集合がdisjoint であることを示せば十分です。

\(R\) における \(v\) の部分木の各頂点に対し、「\(T\) において \(v\) のどの子の部分木に属するか」は \(T\) に対する( \(v\) に依存しない)適当な前計算の下で \(O(\log N)\) で判定できます。したがって、\(v\) を固定したとき、\(O(v \text{ の部分木のサイズ }\log N)\) で判定することができます。

全体の計算量は \(\sum_v O(v \text{ の部分木のサイズ }\log N)\) であり、\(2\) 番目の条件を満たしているような \(R\) に対しては \(O(N(\log N)^2)\)となります。

posted:
last update: