2021年度训练联盟热身训练赛第八场 B题 Gene Tree树中所有叶结点之间的距离平方和

Posted nefu_ljw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021年度训练联盟热身训练赛第八场 B题 Gene Tree树中所有叶结点之间的距离平方和相关的知识,希望对你有一定的参考价值。

2021年度训练联盟热身训练赛第八场 B Gene Tree

题意很简单:求树中所有叶结点之间的距离平方和(若树根的度为1也看作叶结点)。

对于树根root,取两个叶结点x,y,设其距离为dis(x,y),x,y最近公共祖先为lca(x,y),则有:
d i s ( x , y ) = d i s ( r o o t , x ) + d i s ( r o o t , y ) − 2 ∗ d i s ( r o o t , l c a ( x , y ) ) dis(x,y)=dis(root,x)+dis(root,y)-2*dis(root,lca(x,y)) dis(x,y)=dis(root,x)+dis(root,y)2dis(root,lca(x,y))我们进行一次dfs即可求得dis(root,x)和dis(root,y),实现 O ( n ) O(n) O(n)预处理。

dis(root,x)简写为 d x d_x dx,dis(root,y)简写为 d y d_y dy,dis(root,lca(x,y))简写为 d l c a d_{lca} dlca,化简 [ d i s ( x , y ) ] 2 [dis(x,y)]^2 [dis(x,y)]2如下:
[ d i s ( x , y ) ] 2 = ( d x ) 2 + ( d y ) 2 − 4 ∗ d l c a ∗ ( d x + d y ) + 4 ∗ ( d l c a ) 2 + 2 ∗ d x ∗ d y [dis(x,y)]^2=(d_x)^2+(d_y)^2-4*d_{lca}*(d_x+d_y)+4*(d_{lca})^2+2*d_x*d_y [dis(x,y)]2=(dx)2+(dy)24dlca(dx+dy)+4(dlca)2+2dxdy

维护三个值sz、sum1、sum2,放入结构体tr[i]中表示(用 j ∈ s o n ( i ) j∈son(i) json(i) 表示ji的子孙结点):

  • tr[i].sz表示点i的子树中叶结点个数
  • tr[i].sum1表示点i的子树中所有点j到子树根i距离和,即 ∑ j ∈ s o n ( i ) d j \\sum_{j∈son(i)} d_j json(i)dj
  • tr[i].sum2表示点i的子树中所有点j到子树根i距离平方和,即 ∑ j ∈ s o n ( i ) ( d j ) 2 \\sum_{j∈son(i)} (d_j)^2 json(i)(dj)2

那么要求 [ d i s ( x , y ) ] 2 [dis(x,y)]^2 [dis(x,y)]2就转化成了维护四部分相加。设x是u的子孙结点,y是v的子孙结点,lca(x,y)为点u,点u的直接孩子为点v,那么写成代码如下:

  1. p 1 = ∑ x ∈ s o n ( u ) ∑ y ∈ s o n ( v )   [ ( d x ) 2 + ( d y ) 2 ] p_1=\\sum_{x∈son(u)}\\sum_{y∈son(v)}\\ [(d_x)^2+(d_y)^2] p1=xson(u)yson(v) [(dx)2+(dy)2]
    p1=tr[v].sz*tr[u].sum2+tr[u].sz*tr[v].sum2;
  2. p 2 = ∑ x ∈ s o n ( u ) ∑ y ∈ s o n ( v )   [ − 4 ∗ d l c a ∗ ( d x + d y ) ] p_2=\\sum_{x∈son(u)}\\sum_{y∈son(v)}\\ [-4*d_{lca}*(d_x+d_y)] p2=xson(u)yson(v) [4dlca(dx+dy)]
    p2=(-4)*dis[u]*(tr[v].sz*tr[u].sum1+tr[u].sz*tr[v].sum1);
  3. p 3 = ∑ x ∈ s o n ( u ) ∑ y ∈ s o n ( v )   [ 4 ∗ ( d l c a ) 2 ] p_3=\\sum_{x∈son(u)}\\sum_{y∈son(v)}\\ [4*(d_{lca})^2] p3=xson(u)yson(v) [4(dlca)2]
    p3=4*dis[u]*dis[u]*tr[u].sz*tr[v].sz;
  4. p 4 = ∑ x ∈ s o n ( u ) ∑ y ∈ s o n ( v )   [ 2 ∗ d x ∗ d y ] p_4=\\sum_{x∈son(u)}\\sum_{y∈son(v)}\\ [2*d_x*d_y] p4=xson(u)yson(v) [2dxdy]
    p4=2*tr[u].sum1*tr[v].sum1;

说明一下第二次dfs每层的具体操作。搜索点 u u u时,假设其孩子有 v 1 v_1 v1, v 2 v_2 v2,…, v m v_m vm,当搜索完孩子 v i v_i vi,返回本层时, v 1 v_1 v1,…, v i − 1 v_{i-1} 以上是关于2021年度训练联盟热身训练赛第八场 B题 Gene Tree树中所有叶结点之间的距离平方和的主要内容,如果未能解决你的问题,请参考以下文章

2021年度训练联盟热身训练赛第一场

[Nowcoder] 2021年度训练联盟热身训练赛第六场 Mini Battleship | 深搜 回溯 乱搞

[Nowcoder | UPC] 2021年度训练联盟热身训练赛第六场 Hopscotch | 最短路 bfs

2018-2019赛季多校联合新生训练赛第八场(2018/12/22)补题题解

2018湖南多校第八场 训练日志

1780 - 2019年我能变强组队训练赛第十八场