《 $P5642$ 人造情感 》解题报告

发布时间 2023-10-29 09:39:53作者: daduoli

究极套路题,挺有意思的 \(qwq\)

首先我们记一些东西。

\(f(x)\)\(x\) 子树中选出的不交路径权值和最大是多少。

\(g(x)\)\(x\) 子树外的不交路径权值和最大是多少。

如果有了这两个东西那么答案就很好计算了。

那么 \(f(1)\) 实际上就是 \(W(U)\)

\(---------------------------------\)

考虑如何计算 \(f\) ,算是一个比较典的套路。

我们记 \(sum_u=\sum\limits_{t\in son_u} f_t\)

然后我们考虑把路径挂到 \(lca\) 上。

对于一条路径 \((x_i,y_i,w_i)\) ,假设他的 \(lca\)\(u\) ,那么他对 \(u\) 的贡献是 \(w_i+\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u\)

相当于把这条路径给去掉后,剩下各个连通块的最大值之和。

最后对这个东西取一个 \(\max\) 就可以得到 \(f_u\)

而这个东西维护的话,用树剖是很容易解决的,可实际上单点加链求和,可以转换成子树加单点求和,这部分复杂度是 \(O(n\log n)\) 的。

\(---------------------------------\)

接下来考虑如何求 \(g\)

首先 \(g(1)=0\) 这是显然的,考虑如何从 \(u\) 递推到 \(v\)

有三种情况。

  • \(u\) 没有被任何路径经过,\(g_v=g_u+sum_u-f_v\) ,这个也是显然的。

  • \(u\) 被某一条路径经过,记作 \(x_i,y_i,w_i\) ,且 \(lca(x_i,y_i)=u\) ,那么也就是说这条路径经过了 \(u\) 的某两个儿子,记作 \(v_1,v_2\) 。那么这条路径的贡献就是 \(g_u+w_i+\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u-f_v\) ,那么这个东西可以贡献给除了 \(v1,v2\)\(u\) 的儿子。

  • \(u\) 被某一条路径经过,记作 \(x_i,y_i,w_i\) ,而 \(lca(x_i,y_i)\not =u\) ,假设 \(lca(x_i,y_i)=Q\) 那么也就是说这条路径经过了 \(u\) 的某一个儿子,记作 \(v_1\) ,这条路径的贡献就是 \(g_Q+w_i+\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u-f_v\) ,然后可以贡献给除了 \(v_1\) 以外的儿子,而且这是对于 \(x_i\to y_i\) 外的路径都是如此,可以用线段树单点修改,而对于查询就查询自己子树外的最大值即可。

具体二操作如何实现,我们按照 \(w_i+\sum \limits_{j\in x_i\to y_i} sum_j-f_j\) 排序,然后枚举找到第一个合法的位置,暴力找就可以了,为什么这样复杂度是对的呢,因为每条路径最多会失败两次,所以实际上是对的。

这部分复杂度也是 \(O(n\log n)\) 的。

\(---------------------------------\)

现在知道了 \(f,g\) 考虑如何计算贡献。

考虑答案形状实际上就是若干个 \(f\) 加上一个 \(g\) ,也就是 \(\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u+g(fa[lca(x_i,y_i)])+w_i\)

容易发现 \(\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u+g(fa[lca(x_i,y_i)])\) 肯定是 \(\le f_1\) 的。

我们令 \(f_1-\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u+g(fa[lca(x_i,y_i)])\) ,就可以得到 \(w_i\) 第一个不贡献的位置,也就是临界点,然后加 \(1\) 就是答案。

考虑拆贡献。

每个 \(f_u\) 被贡献,当且仅当 \(fa_u\) 被选了,而 \(u\) 没有被选择,考虑容斥算这个东西的方案数。

先记 \(sz_i\) 表示 \(i\) 的子树大小 \((n\times n-2\times sz_i\times (n-sz_i)-\prod\limits_{t\in son} sz_t^2\times (n-sz_u)^2)\) ,这个就是方案数。

\(g\) 也同理。

这个东西复杂度是 \(O(n)\) 的。

总复杂度是 \(O(n\log n)\) ,解决该题。