其他分享
首页 > 其他分享> > 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)\).

标签:cnt,val,记录,sum,times,写题,ans,2022.6,mathrm
来源: https://www.cnblogs.com/yukari1735/p/16333921.html