f[i][j]表示离点i距离为j的点个数,g[i][j]表示点i子树外还需一个距离i为j的点对个数
先
ans=∑f[i][j]∗g[son][j+1]+∑g[i][j]∗f[son][j−1]
a
n
s
=
∑
f
[
i
]
[
j
]
∗
g
[
s
o
n
]
[
j
+
1
]
+
∑
g
[
i
]
[
j
]
∗
f
[
s
o
n
]
[
j
−
1
]
再
f[i][j]=∑f[son][j−1],g[i][j]=∑g[son][j+1]
f
[
i
]
[
j
]
=
∑
f
[
s
o
n
]
[
j
−
1
]
,
g
[
i
]
[
j
]
=
∑
g
[
s
o
n
]
[
j
+
1
]
然后发现f和g的转移可以通过移动数组的指针实现,对深度最大的儿子这样做一下,复杂度是O(n)的.
Code
洛谷P3565 [POI2014]HOT-Hotels
最新推荐文章于 2022-09-05 18:50:36 发布