1 条题解

  • 1
    @ 2023-6-24 16:52:06

    把相交部分的贡献分为 22 部分:属于子树的路径,和不属于子树的路径。

    属于子树的路径,可以在 lca\operatorname{lca} 处加上贡献,然后对于一条路径只用获取其各节点上该贡献即可统计。

    不属于子树的路径,可以在 lca\operatorname{lca} 之外加上贡献,然后对于一条路径只用获取其 lca\operatorname{lca} 上该贡献即可统计。

    我们假设一个节点的两部分贡献分别为 ap,bpa_p,b_p

    从一个点开始往下的链的最大 aa 贡献为 vpv_p

    vp=maxs{vs+ap}v_p=\max_s\{v_s+a_p\} $$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}\}\}$,分轻重儿子讨论即可。

    要在每个节点处维护轻儿子的 vv 值的可删堆。

    aa 的贡献修改是单点加,容易处理。

    bb 的贡献修改我们套一个树上差分改为一路到根的修改,然后考虑怎么做。

    我们的转移矩阵大概长成

    $$\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} $$

    假如忽略掉 fsf_{s_{\text{轻}}},要对 bpb_p 进行链加,我们可以改写成

    $$\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} $$

    相邻的部分消除掉,区间加时相当于是在首尾引入了矩阵乘法,直接计算贡献即可。

    然而不可忽略,因此我们直接把每个重链的 ff 插入另一个可删堆即可。

    直接做复杂度即为 O(n+qlog2n)O(n+q\log^2n) 的。

    把树剖换成 GBT,对轻儿子按子树大小排序后用带权平衡树代替可删堆,复杂度应该是可以做到 O(n+qlogn)O(n+q\log n) 的?

    参考代码

    • 1

    信息

    ID
    4732
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者