ABC298Ex

水紫。

多次询问 \(L,R\),求出 \(\sum\limits_{i=1}^n \min(d(i,L),d(i,R))\)

不失一般性的令 \(del_L\le del_R\)

分几部分考虑。

  • \(L\)\(R\) 的子树中。

预处理 \(f_i\) 代表 \(i\) 的子树中的点到 \(i\) 的距离和,\(s_i\) 代表 \(i\) 的子树大小。

转移方程:\(f_i=\sum\limits_{j\in son_i}f_j+s_j\)\(s_i=1+\sum\limits_{j\in son_i}s_j\)

该部分的答案为 \(f_L+f_R\)

  • 不在 \(L\)\(R\)\(\operatorname{lca}\) 的子树中。

\(k\)\(\operatorname{lca}(L,R)\)

该部分的路径一定是形如 \(i\rightarrow k\rightarrow L/R\)。后半部分取决于 \(d(k,L)\)\(d(k,R)\) 谁更小,令 \(m=\min(d(k,L),d(k,R))\)

前半部分是简单的换根 dp,令 \(g_i\) 代表不在 \(i\) 的子树中的点到 \(i\) 的距离和。

转移方程:\(g_i=g_{fa}+(n-s_{fa})+f_{fa}-(f_p+s_p)+s_{fa}-s_p=g_{fa}+f_{fa}+n-f_p-2\times s_p\)

该部分答案为 \(g_k+(n-s_k)\times m\)

  • \(L\rightarrow R\) 路径上的点的子树中。

这些点一定会先移动到路径上的某个点,然后移动到 \(L/R\),设移动到 \(R\) 的判断距离阈值为 \(B\),利用倍增求出 \(R\) 的树上 \(B\) 级祖先 \(x\),则对原树上 \(L\rightarrow k\rightarrow R\) 分成 \(L\rightarrow y\)\(x\rightarrow R\) 两部分考虑,其中 \(y\)\(x\) 在链上的下一个点。

注意到 \(y\) 仍然可能位于 \(k\rightarrow R\) 这条链上,这也说明 \(L\rightarrow y\) 并不是一条深度递减的链,因此将 \(L\rightarrow y\) 拆成 \(L\rightarrow k\)\(y\rightarrow k\) 两条链,这样我们只需要对三条直上直下的链处理即可。

注意到这部分已经将第一部分的约束规约,因此可以直接做该部分的约束

posted @ 2024-08-22 11:34  BYR_KKK  阅读(17)  评论(0)    收藏  举报