前一段时间看的题解写的欧拉序做法,感觉非常的智慧啊,所以这篇题解口糊一个 ddp 做法。
解法
首先没有修改操作的部分很简单,考虑树形 dp,设 $f_{i,0}$ 表示 $i$ 向下到叶子的最远距离,$f_{i,1}$ 表示 $i$ 子树内任意两点能达到的最远距离。
设 $w_i$ 表示 $i$ 和其父亲之间的边权,有转移方程:
\[f_{i,0} = w_i + \max \limits _{j \in son\{i\}} f_{j,0} \\ f_{i,1} = \max (\max \limits _{j \in son\{i\}} f_{j,1},\max \limits _{j,k \in son\{i\},j \neq k} f_{j,0} + f_{k,0})\]考虑加上修改操作,这里发现上述转移方程只有 $(\max,+)$ 两种运算,且两者均有交换律、结合律,且 $+$ 对 $\max$ 有分配律,所以可以定义广义矩阵乘法 $(\max,+)$,设 $i$ 的重儿子为 $hvson_i$,轻儿子的点集为 $lson{i}$,有矩乘转移:
\[\begin{bmatrix} f_{i,0} \\ f_{i,1} \\ 0 \end{bmatrix} = \begin{bmatrix} w_i & -\infty & w_i + \max \limits _{j \in lson\{i\}} \\ \max \limits _{j \in lson\{i\}} & 0 & \max (\max \limits _{j \in lson\{i\}} f_{j,1},\max \limits _{j,k \in lson\{i\},j \neq k} f_{j,0} + f_{k,0}) \\ -\infty & -\infty & 0 \end{bmatrix} \begin{bmatrix} f_{hvson_i,0} \\ f_{hvson_i,1} \\ 0 \end{bmatrix}\]因为转移时需要有一些常数上的运算帮助转移,所以加了一维加法单位元。
考虑每个节点使用优先队列动态维护所有轻儿子的 $f_{i,0}$ 和 $f_{i,1}$ 中的最大值和次大值。
总时间复杂度 $\mathcal{O}(q \log ^2 n)$。
因为是口糊的,所以没有代码。