首页 > 其他 > 详细

[SOJ618] 小$\omega$的数据结构题【差分】【树链剖分】

时间:2019-10-13 21:46:33      阅读:129      评论:0      收藏:0      [点我收藏+]

娃娃机毒瘤 qwq

题意简述:给定一棵\(n\)个点的有根树,\(m_a\)\(a\)链和\(m_b\)\(b\)链,保证任意一条链的端点之间存在祖先-后代关系。求\(\sum_{i=1}^{m_a} \sum_{j=1}^{m_b} f_p(a_i, b_j)\),其中,

\[f(a, b)=\begin{cases} 0, &a \cap b=\varnothing\(|a\cap b|-1)^p, &\text{otherwise} \end{cases} \]

注意此处的交为点相交,且我们认为\(0^0=1\)\(1\leq n, m_a, m_b\leq 10^5, p\in\{0, 1, 2\}\)


对于\(p=1\)的情况,发现 \(f_1(a, b)=a,b\)的交集。将\(a\)链树上差分,每条\(b\)链直接查询即可。

对于\(p=0\)的情况,发现 \(f_0(a, b)=a, b\)的交集\(-f_1(a, b)\)。方法与\(p=1\)类似。

下面重点处理\(p=2\)的情况。

设红链形如\((u_i, v_i)\),蓝链形如\((x_i, y_i)\),其中\(u_i\)\(v_i\)的祖先,\(x_i\)\(y_i\)的祖先。我们可以只考虑\(x_i\)\(u_i\)祖先的情况,剩余情况对称考虑即可,只需注意\(x_i=u_i\)时的去重。设交集非空的两条链\(a_i\)\(b_j\)的交集中,深度\(dep\)最大的点为\(w\),则\(f_2(a_i, b_j)=(dep_w-dep_{u_i})^2=dep_w^2+dep_{u_i}^2-2 dep_w\cdot dep_{u_i}\).

先对整棵树dfs,经过每个\(u_i\)时,维护\(x_j\)\(u_i\)到根的路径中的蓝链的集合,考虑对以上三部分分别统计答案:

  • \(dep_{u_i}^2\):由于当前dfs到了点\(u_i\),可以直接计算\(dep_{u_i}^2\)。发现每存在一条蓝链与其相交,这部分贡献就会多算一次,因此直接树上差分计算\(u_i\)的子树中,\(y_j\)的数量即可。

  • \(-2dep_w\cdot dep_{u_i}\):同样可以直接计算\(-2 dep_{u_I}\),乘上\(\sum dep_w\)即可。\(\sum dep_w\)的统计可以在dfs进入\(x_i\)时,在\(x_i\)\(y_i\)的链上\(+1\),询问时直接求\(u_i\)\(v_i\)的点权和即可。

[SOJ618] 小$\omega$的数据结构题【差分】【树链剖分】

原文:https://www.cnblogs.com/suwakow/p/11668177.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!