码迷,mamicode.com
首页 > 其他好文 > 详细

Ideas

时间:2019-07-23 09:25:56      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:维护   class   shu   复杂度   抽象   inline   部分   自底向上   长度   

放一些出题的想法

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

首先若从一个点出发有长度为 \(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

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

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

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

Ideas

标签:维护   class   shu   复杂度   抽象   inline   部分   自底向上   长度   

原文地址:https://www.cnblogs.com/study-ysj/p/11229552.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!