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)−2∗dis(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)2−4∗dlca∗(dx+dy)+4∗(dlca)2+2∗dx∗dy
维护三个值sz、sum1、sum2,放入结构体tr[i]中表示(用
j
∈
s
o
n
(
i
)
j∈son(i)
j∈son(i) 表示j
为i
的子孙结点):
tr[i].sz
表示点i
的子树中叶结点个数。tr[i].sum1
表示点i
的子树中所有点j
到子树根i
的距离和,即 ∑ j ∈ s o n ( i ) d j \\sum_{j∈son(i)} d_j ∑j∈son(i)dj。tr[i].sum2
表示点i
的子树中所有点j
到子树根i
的距离平方和,即 ∑ j ∈ s o n ( i ) ( d j ) 2 \\sum_{j∈son(i)} (d_j)^2 ∑j∈son(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,那么写成代码如下:
-
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=∑x∈son(u)∑y∈son(v) [(dx)2+(dy)2]
p1=tr[v].sz*tr[u].sum2+tr[u].sz*tr[v].sum2;
-
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=∑x∈son(u)∑y∈son(v) [−4∗dlca∗(dx+dy)]
p2=(-4)*dis[u]*(tr[v].sz*tr[u].sum1+tr[u].sz*tr[v].sum1);
-
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=∑x∈son(u)∑y∈son(v) [4∗(dlca)2]
p3=4*dis[u]*dis[u]*tr[u].sz*tr[v].sz;
-
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=∑x∈son(u)∑y∈son(v) [2∗dx∗dy]
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树中所有叶结点之间的距离平方和的主要内容,如果未能解决你的问题,请参考以下文章 [Nowcoder] 2021年度训练联盟热身训练赛第六场 Mini Battleship | 深搜 回溯 乱搞 [Nowcoder | UPC] 2021年度训练联盟热身训练赛第六场 Hopscotch | 最短路 bfs