2022.6 寫題記錄
阿新 • • 發佈:2022-06-01
考慮離線詢問,掛到節點上,然後從下往上維護答案.
首先對於每個節點 \(u\) 預處理一個路徑權值字首和 \(\mathrm{val}[u]\),那麼兩個點的距離就是 \(\mathrm{val}[u]+\mathrm{val}[v]-2\ \mathrm{val}[\mathrm{LCA}(u,v)]\).
對於當前子樹的每個深度 \(k\) 維護一個 \(\mathrm{sum}_k\) 表示 \(\sum_{\mathrm{dep}[u]=k}\mathrm{val}[u]\), \(\mathrm{cnt}_k\) 表示深度為 \(k\)
合併兩棵子樹 \(u,v\) 時,設他們的父親為 \(w\) 兩棵子樹內部的答案已經統計過了,所以只需要加上經過 \(w\) 的路徑的答案就好.
左子樹的一個深度為 \(k\) 可以和右子樹任意一個深度為 \(k\) 的節點構成一條路徑,所以它貢獻了 \(v.\mathrm{cnt}_k\) 次,右子樹中的節點同樣.
注意要減去 \(w\) 的貢獻.
\[w.\mathrm{ans}_k=u.\mathrm{ans}_k+v.\mathrm{ans}_k+(u.\mathrm{sum}_k-u.\mathrm{cnt}_k\times \mathrm{val}[w])\times v.\mathrm{cnt}_k+(v.\mathrm{sum}_k-v.\mathrm{cnt}_k\times \mathrm{val}[w])\times u.\mathrm{cnt}_k. \]可以以深度 \(k\)
時間複雜度 \(O((n+q)\log n)\).