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的主要内容,如果未能解决你的问题,请参考以下文章