标签:cnt val 记录 sum times 写题 ans 2022.6 mathrm
考虑离线询问,挂到节点上,然后从下往上维护答案.
首先对于每个节点 \(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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。