1 条题解
-
1
把相交部分的贡献分为 部分:属于子树的路径,和不属于子树的路径。
属于子树的路径,可以在 处加上贡献,然后对于一条路径只用获取其各节点上该贡献即可统计。
不属于子树的路径,可以在 之外加上贡献,然后对于一条路径只用获取其 上该贡献即可统计。
我们假设一个节点的两部分贡献分别为 。
从一个点开始往下的链的最大 贡献为 。
则
$$ans=\max\{b_p+a_p+v_{s_1}+v_{s_2}|p,s_1\neq s_2,s_1,s_2\text{ 可不存在}\} $$容易构造 ddp:设 $f_p=\max\{\max_s\{f_s\},\max_{s_1\neq s_2}\{b_p+a_p+v_{s_1}+v_{s_2}\}\}$,分轻重儿子讨论即可。
要在每个节点处维护轻儿子的 值的可删堆。
对 的贡献修改是单点加,容易处理。
对 的贡献修改我们套一个树上差分改为一路到根的修改,然后考虑怎么做。
我们的转移矩阵大概长成
$$\begin{bmatrix}0&u_p+a_p+b_p&\max\{w_p+a_p+b_p,f_{s_{\text{轻}}}\}\\-\infty&a_p&u_p+a_p\\-\infty&-\infty&0\end{bmatrix} $$假如忽略掉 ,要对 进行链加,我们可以改写成
$$\begin{bmatrix}b_p&-\infty&-\infty\\-\infty&0&-\infty\\-\infty&-\infty&0\end{bmatrix}\begin{bmatrix}0&u_p+a_p&w_p+a_p\\-\infty&a_p&u_p+a_p\\-\infty&-\infty&0\end{bmatrix}\begin{bmatrix}-b_p&-\infty&-\infty\\-\infty&0&-\infty\\-\infty&-\infty&0\end{bmatrix} $$相邻的部分消除掉,区间加时相当于是在首尾引入了矩阵乘法,直接计算贡献即可。
然而不可忽略,因此我们直接把每个重链的 插入另一个可删堆即可。
直接做复杂度即为 的。
把树剖换成 GBT,对轻儿子按子树大小排序后用带权平衡树代替可删堆,复杂度应该是可以做到 的?
参考代码。
- 1
信息
- ID
- 4732
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者