专栏文章

题解:P5642 人造情感(emotion)

P5642题解参与者 12已保存评论 11

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
11 条
当前快照
1 份
快照标识符
@minn39w4
此快照首次捕获于
2025/12/02 05:06
3 个月前
此快照最后确认于
2025/12/02 05:06
3 个月前
查看原文

P5642

Part 1: 求 W(S)W(S)

我们设 fuf_u 表示 uu 子树内 W(S)W(S) 的最大值,gug_u 表示 uu 子树内不选 uuW(S)W(S) 的最大值。
那么首先有 gu=vson(u)fvg_u = \sum_{v \in son(u)} f_v
fuf_u 分两种情况。
  • uu 不被路径经过,fu=guf_u = g_u
  • uu 被路径经过,枚举每条 lcalcauu 处的路径 (x,y,w)(x,y,w),考虑除开这条路径,计算这条路径所附带的子树的贡献,则 fu=max{w+vpath(x,y)(gvznext(v)fz)}f_u = \max\{w + \sum_{v \in path(x,y)} (g_v - \sum_{z \in next(v)} f_z)\},其中 next(v)next(v) 表示 vv 在路径上的儿子,化简得 fu=max{gu+w+vpath(x,y),vugvfv}f_u = \max \{ g_u + w + \sum_{v \in path(x,y), v \ne u} g_v - f_v \}
可以用 树链剖分+树状数组 做到 O(nlog2n)O(n \log^2 n) 但是还不够优,可以令树状数组 valuval_u 表示 vpath(1,u)gufu\sum_{v \in path(1,u)} g_u-f_u,相当于树上前缀和,至于修改时则使 uu 子树内的 valv=valv+gufvval_v = val_v + g_u-f_v,可以对树状数组差分,即可做到 O(nlogn)O(n \log n)

Part 2: 求单个 F(u,v)F(u,v)

观察 W(U{(u,v,w+1)})>W(U)W(U \cup \{(u, v, w + 1)\}) > W(U) 的条件,发现是相当于 (u,v)(u,v) 的路径的权值是 ww 时,要求此路径必选。仿照求 ff 的思路,我们可以钦定这条路径要选,则令 huh_u 表示 uu 子树外的 W(S)W(S) 的最大值,那么有
hlca+glca+kpath(u,v),klcagkhk+F(u,v)=f1h_{lca} + g_{lca} + \sum_{k \in path(u,v), k \ne lca} g_k-h_k + F(u,v) = f_1
移项得
F(u,v)=f1hlcaflcakpath(u,v)gkhkF(u,v) = f_1 - h_{lca} - f_{lca} - \sum_{k \in path(u,v)} g_k-h_k

Part 3: 求 huh_u

依然仿照求 ff 的思路,不过求 huh_u 需要换根 dp。
vvuu 的一个儿子,现在求 hvh_v,则我们新加了 uuvv 的儿子的子树部分,可以分两种情况考虑。
  • 没有路径经过 uu,则 hv=hu+gufvh_v = h_u + g_u - f_v
  • 有路径经过 uu,则枚举经过 uu 但不经过 vv 的路径 (x,y,w)(x,y,w),则 hu=max{fv+hlca+glca+w+kpath(u,v),klcagkhk}h_u = \max \{-f_v + h_{lca} + g_{lca} + w + \sum_{k \in path(u,v), k \ne lca} g_k-h_k \}
第二种情况非常不好统计,考虑再分情况,观察一下发现又可分情况。
  • lca=ulca = u,如果直接枚举会被菊花图卡成 O(nm)O(nm),可以按照贡献提前排序,再枚举就是严格 O(n)O(n)
  • lcaulca \ne u,那么路径中一个端点一定在 uu 的非 vv 子树,另一个端点在 uu 祖先的其它子树中,可以用树套树通过连续的 dfn 值查询,这样可以获得 96pts96 pts,仍然无法通过。
我们考虑能否把一层线段树去掉,也就是降维,这里考虑把端点在 uu 祖先的其它子树中的降去,则需考虑每次 dfs 到 (u,v)(u,v) 时,我们查询的一个端点一定在 uu 的非 vv 子树的路径都是合法的。
首先,我们必须把 lcalcauu 的祖先的路径加入线段树,我们如果算完 fvf_v 后就把 lca 为 vv 的贡献加入,那么查询 uu 其他子树时就有问题,考虑算完所有 hvh_v 后把 lca 为 uu 的贡献加入,然后统一 dfs(v)dfs(v),这样是正确的,因为 uu 更新 vv 的任务完成了我们才加入线段树,即使他不在另一个点 kk 的祖先上,那么也不会查到它。这样时间复杂度和空间复杂度都是 O(nlogn)O(n \log n)

Part 4: 求所有 F(u,v)F(u,v)

&= n^2 \times f_1 - \sum_{i=1}^{n} (p_i \times (h_i + f_i) + q_i \times (g_i - f_i)) \end{aligned}$$ 其中 $p_i$ 表示 lca 为 $i$ 的路径数量,$q_i$ 表示经过 $i$ 的路径数量,dfs 时计算即可。 总时间复杂度 $O(n \log n)$。

评论

11 条评论,欢迎与作者交流。

正在加载评论...