Official

D - Tree and Intervals Editorial by m_99


頂点 \(i\) に接続する辺のうちもう一方の端点が \(i\) 未満のものの本数を \(l_i\)、そうでないものの本数を \(r_i\) とします。すると \(x_i = \sum_{j=1}^{i} (r_j-l_j)\) です。

まず、\(l_1,r_1,l_2,r_2,\ldots,l_N,r_N\) に対応する木が存在する条件を考えます。

  1. 明らかに \(l_1=0, r_N=0, \sum(r_j-l_j)=0\) が必要です。
  2. \(i\) に対し、\(l_i \neq 0\) または \(r_i \neq 0\) が必要です。
  3. 番号 \(i\) 以下の頂点から誘導される森は頂点数 \(i\)、辺数 \(\sum l_j\)で、このとき連結成分数は \(i-\sum l_j\) ですが、これが正になることが必要です。さらに \(i \lt N\) の場合は、 \(i\) 以下の頂点と \(i\) より大きい頂点を結ぶ辺の本数は \(\sum (r_j-l_j)\) ですが、これが連結成分数以上であることも必要です(そうでないと孤立した連結成分が出来るため)。まとめると、\(1 \leq i- \sum l_j \leq \sum (r_j -l_j)\) が必要です。
  4. 3の \(i=N-1\) の場合には \(i\) 以下の頂点を結ぶ辺数と連結成分数が一致しないといけないため、\(N-1-\sum_{j=1}^{N-1} l_j = \sum_{j=1}^{N-1}(r_j - l_j)\) が必要です。

また、上記4条件は十分条件でもあります。\(i=1,2,\ldots,N\) の順に \(l_i\) 本の辺を既存の連結成分に繋げていくとして、未使用の辺が \(2\) 本以上存在する連結成分が存在するならばまずそこに繋げるようにするとどの連結成分も未使用の辺が存在する状態を条件成立下で保てるためです。

元の \(x_i\) を数える問題に戻ると、2番目の条件は各 \(i\) について \(1 \leq i-\sum_{j=1}^{i} l_j \leq x_i\) です。ここで、\(x_i=\sum(r_j-l_j)\) を保ったまま \(l_i\) を増やすのは自由( \(r_i\) を同時に増やす、これによって条件違反が発生することはない)なので \(\sum l_j\) は最小のものを考えると都合が良いです。\(\mathrm{dp}_{i,j,k}\) を「\(x_i=j\)\(\sum_{t=1}^i l_t\) の最小値が \(k\) であるような場合の数」として遷移を累積和で行い、適宜条件を考慮すると \(\mathrm{O}(N^3)\) で本問を解くことができます。

posted:
last update: