如果能反复,考虑在点
u
u
u开始进行反复。开始点为点v。则最长能滑动的总路径为
2
h
v
−
h
u
2h_v - h_u
2hv−hu这是因为从点v到点u多余能量
h
v
−
h
u
h_v - h_u
hv−hu,在u点开始与其邻居进行反复,直到能量消耗为0.至此,共消耗能量
2
(
h
v
−
h
u
)
2 (h _v - h_u)
2(hv−hu)。加上从u点到doge能滑动最长的距离
h
u
h_u
hu。
由上式可见,若
h
u
h_u
hu较小,则滑动的距离较大。因此对每个结点找其能到达的高度最低的u点,如果能找到答案为上述式子,否则答案为自身的高度
逆向考察
对上述u点,其必须满足至少有一个邻居与其有同样的高度。对于这样的点对
u
,
v
u,v
u,v,v是u的与其相同高度的邻居。其到达它们最近的doge的路径互不相交。因此
∑
u
∈
S
h
u
\sum_{u \in S} h_u
u∈S∑hu较小。可以证明其是
O
(
n
)
O(n)
O(n)级别的。于是不同的
h
u
h_u
hu个数是
n
\sqrt{n}
n级别的。
ans[i][z]表示i号结点到达z号高度满足邻居有相同z号高度的结点所需要的最少初始能量,其中z的取值是
n
\sqrt{n}
n级别的。
将结点按高度进行分层。假设下一层所需要到达的每一种可能高度的最低能量已经求出,下一层对上一层按照公式:
a
n
s
[
x
]
[
i
]
=
m
i
n
(
a
n
s
[
x
]
[
i
]
,
m
a
x
(
0
,
a
n
s
[
c
]
[
i
]
−
1
)
)
ans[x][i]=min(ans[x][i],max(0,ans[c][i]-1))
ans[x][i]=min(ans[x][i],max(0,ans[c][i]−1)) 其中c是下一层结点,x是当前层结点。
同层结点的转移,利用up and down dp,通过两次dfs(待学习)
a
n
s
[
c
]
[
i
]
=
m
i
n
(
a
n
s
[
c
]
[
i
]
,
a
n
s
[
i
d
]
[
i
]
+
1
)
ans[c][i]=min(ans[c][i],ans[id][i]+1)
ans[c][i]=min(ans[c][i],ans[id][i]+1) 其中id是c的邻居,对每种高度i循环执行