Ideas

Posted study-ysj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ideas相关的知识,希望对你有一定的参考价值。

放一些出题的想法

求带边权树上经过点 \(i\) 的所有简单路经长度之和,要求 \(O(n)\) 算法

首先若从一个点出发有长度为 \(c_1,c_2,c_3,...,c_n\) 的若干路径,那么答案为 \((\sum_i=1^nc_i)^2-\sum_i=1^nc_i^2\)

\(\sum_i=1^nc_i\)\(f\)\(\sum_i=1^nc_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_ih'_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

\(k\) 种接收器,每种接收器都可以接受 \(0,1,2...n-1\) 中的任一数字并吐出一新数字 ,给出 \(k\) 种接收器的输入输出规则,支持修改某个位置上接收器的种类,多次询问一个数字依次通过 \(n\) 个接收器后的值是多少

在线段树上维护一种抽象的"接收器",\(O(n)\) \(pushup\)即可

思维难度:NOIP提高组D2T1
代码难度:NOIP提高组D1T2

以上是关于Ideas的主要内容,如果未能解决你的问题,请参考以下文章