1. 程式人生 > 其它 >2022.6 寫題記錄

2022.6 寫題記錄

P7581 「RdOI R2」路徑權值(distance)

考慮離線詢問,掛到節點上,然後從下往上維護答案.

首先對於每個節點 \(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\)

的節點數量,\(\mathrm{ans}_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\)

作為鍵值,用線段樹合併維護.詢問 \(u\) 時線上段樹上查詢 \(\mathrm{ans}_{\mathrm{dep}[u]+k}\) 就好。

時間複雜度 \(O((n+q)\log n)\).