标签:维护 class shu 复杂度 抽象 inline 部分 自底向上 长度
放一些出题的想法
首先若从一个点出发有长度为 \(c_1,c_2,c_3,...,c_n\) 的若干路径,那么答案为 \((\sum_{i=1}^{n}c_i)^2-\sum_{i=1}^{n}c_i^2\)
记 \(\sum_{i=1}^{n}c_i\) 为 \(f\),\(\sum_{i=1}^{n}c_i^2\) 为 \(g\) ,\(i\) 号点的答案即为 \(f_i^2-g_i\)
下面考虑如何求解 \(f,g\)
套路地先求解 \(i\) 子树内的 \(f',g'\),即先只考虑从 \(i\) 出发到达 \(i\) 子树内的路径
设辅助数组 \(h_i\) 表示从 \(i\) 出发的路径条数, \(h'_i\) 数组表示从 \(i\) 出发到达子树内的路径条数
所以有
\(h'_i=\sum_{j∈son_i}h'_j\)
\(f'_i=\sum_{j∈son_i}(f'_j+h'_j*w_{ij})\)
\(g'_i=\sum_{j∈son_i}(g'_j+2*w_{ij}*f'_j+h'_j*w_{ij}^2)\)
先通过一遍自底向上的 \(Dfs\) 求出 \(f',g',h'\),下面就要考虑如何自顶向下求解
首先,若从 \(i\) 出发,第一步要么走入 \(i\) 的子树(这部分我们已经求过),要么向上走到 \(i\) 的父亲 \(fa\)
不难发现走到 \(fa\) 后接下来的路径信息相当于 \(f_{fa},g_{fa},h_{fa}\) 减去 \(i\) 的贡献得到的(因为简单路径不能往回走),那么 \(f_i,g_i,h_i\) 就等于 \(f'_i,g'_i,h'_i\) 加上走到父亲后的路径贡献即可
复杂度 \(O(n)\)
思维难度:NOIP提高组D1T3
代码难度:NOIP提高组D1T2
在线段树上维护一种抽象的"接收器",\(O(n)\) \(pushup\)即可
思维难度:NOIP提高组D2T1
代码难度:NOIP提高组D1T2
标签:维护 class shu 复杂度 抽象 inline 部分 自底向上 长度
原文地址:https://www.cnblogs.com/study-ysj/p/11229552.html