E - Minimize Sum of Distances Editorial by cirno3153

辺の寄与を求めて解く

頂点 \(1\) を根とする根付き木だとして、全ての \(f(x)\) を直接求める方針で解きます。

各辺について、その辺を切った時に分離される二つの頂点集合をそれぞれ \(U, V\) とし、 \(U\) に頂点 \(1\) が属するものとします。
その時、 \(U\) 側の頂点には \(V\) 側の頂点それぞれからこの辺を通って重みが加算されることから、 \(\sum_{v \in V} C_v\)\(u \in U\) を満たす全ての \(f(u)\) に寄与します。同様に \(\sum_{u \in U} C_u\)\(v \in V\) を満たす全ての \(f(v)\) に寄与します。
従って、各辺について\(\sum_{u \in V} C_v\) などを高速に求め、それを \(U\) に含まれる全ての頂点に加算できれば良いです。

ここで、頂点番号が仮にdfs順に割り振られていたとすると、 \(V\) は区間を成し、 \(U\) も高々二つの区間で表すことができます。
従って、あらかじめ頂点番号をdfs順に振りなおすことで、 \(\sum_{v \in V} C_v\) は累積和、 \(f(u)\) への寄与はimosをすることで辺ごとに定数時間で計算することができ、全体 \(O(N)\) で解くことができます。

posted:
last update: