ARC228 B - Minimize Topological Order

最小トポロジカル

考え方

まず、$f(T)$ の作り方を考える。
これは、以下のように最良優先探索で貪欲に処理すればよい。

ということは、それが指定の順列 $P$ に一致する根付き木 $T$ は、以下のように作られる。

よって、この作り方でコストが最小になるような親の選び方を求める問題ということになる。

コストは、$i$ 番の頂点に $k$ 個の子がいると、$A_i\times k^2$ だけかかる。
つまり、既に $k$ 個の子を持っているところに $1$ つ追加するコストは $A_i\times (2k+1)$ である。
この毎回のコストが最小であるように選ぶ貪欲法が成立するか考えよう。

頂点 $P_i$ を追加するときに、その場でコスト最小である親が $X$ だったとしよう。
そこであえて $Y$ を親に選択してみて、これで得することがあるかどうかを考える。

まず、それ以後誰も $X$ を親に選ばなかった場合。
その場合、単純に $P_i$ の親を $Y$ から $X$ に変更しただけの解が、同等以下のコストになる。

一方、それ以降に誰かが親に $X$ を選んだ場合。
次に $X$ を親に選んだ頂点を $P_j$ とする。
この状況では、以下が成立している。

以上より、あえてその場で損をすることで後で得するパターンは存在しない。
よって、毎回の追加コストが最小であるように選ぶ貪欲法でよいことがわかった。
したがって、$O(N^2)$ でよければこれで解けた。

あとは、高速化である。

まず、選択肢の範囲探索の高速化。
これは、以下のようにすればよい。
空の stack を用意し、順列を後ろから見て、順に以下を実行する。

そして、コストが最も安い親を選ぶ方法。
これは最小値を求めるsegment木でよい。
頂点番号順でなく順列にある順に、「次にそれを親に選ぶとコストはいくつか?」を入れておく。
選択肢の範囲と同じ範囲で、最小値がある位置が、そのときに親にするべき頂点である。
コスト情報更新も込みで、$O(N\log N)$ で処理できる。

よって、全体として $O(N\log N)$ まで高速化でき、間に合う。

入力例2での動作

入力を受け取る。

n: 5
p: {3, 1, 5, 2, 4}
a: {4, 1, 1, 2, 1}

以下、順列上の位置は 0-indexed で表し、頂点番号は入力のまま表す。

まず、各位置について親として選べる範囲の左端を求める。
順列 $P=\{3,1,5,2,4\}$ を後ろから stack で処理すると、次のようになる。
stack は左から順に底から上を表す。

i=4: 4 を追加
stack: {4}

i=3: 2 を追加
stack: {4, 2}

i=2: 2, 4 を取り除き、5 を追加
b[3] = 2
b[4] = 2
stack: {5}

i=1: 1 を追加
stack: {5, 1}

i=0: 1 を取り除き、3 を追加
b[1] = 0
stack: {5, 3}

最後まで残った頂点については先頭から選べるので、b[2]=0 となる。
b[0] は使用しないダミーとして $-1$ とする。
各位置の左端は次のようになる。

b: {-1, 0, 0, 2, 2}

次に、segment木の位置 $i$ に、頂点 $P_i$ を次に親として選ぶ場合の追加コストを入れる。
最初はどの頂点も子を持たないので、各位置の値は $A_{P_i}$ そのものである。

segment木: {1, 4, 1, 1, 2}
累積コスト: 0

$i=1$、頂点 $1$ を追加する。
親候補は位置区間 $[b[1],1)=[0,1)$ にある頂点 $3$ のみ。
追加コスト $1$ で頂点 $3$ を親にする。

頂点 $3$ の子は $1$ 個になったので、次に子を追加するコストは $1\times(2\times1+1)=3$ となる。

segment木: {3, 4, 1, 1, 2}
累積コスト: 1

$i=2$、頂点 $5$ を追加する。
親候補は位置区間 $[0,2)$ にある頂点 $3,1$ で、追加コストはそれぞれ $3,4$。
よって頂点 $3$ を親にする。

頂点 $3$ の子は $2$ 個になったので、次の追加コストは $1\times(2\times2+1)=5$ となる。

segment木: {5, 4, 1, 1, 2}
累積コスト: 4

$i=3$、頂点 $2$ を追加する。
親候補は位置区間 $[2,3)$ にある頂点 $5$ のみで、追加コストは $1$。
頂点 $5$ を親にする。

segment木: {5, 4, 3, 1, 2}
累積コスト: 5

$i=4$、頂点 $4$ を追加する。
親候補は位置区間 $[2,4)$ にある頂点 $5,2$ で、追加コストはそれぞれ $3,1$。
よって頂点 $2$ を親にする。

累積コストは $6$ となるので、答えは $6$ である。

注意点

コストや答えは int 型からはみ出る。
long long 型を用いること。

別解

特になし。