很思維,有點樹形dp的影子
顯然小y不會向根節點走,因為小y的目標是葉子節點,向根節點走一定不優
因此,我們可以對於每個子樹進行考慮,設f[u
]f[u]
f[u]
表示小y的棋子在u
uu時,如果只考慮u
uu節點的子樹,那麼小d至少需要先操作多少次才能獲勝
接下來考慮轉移,首先,葉子節點的f
ff值顯然為1
11,小d只有先操作才能獲勝
然後對於乙個節點u
uu,因為小d得要把所有非葉節點都堵上,所以總的操作次數是∑v∈
sonu
f[v]
\displaystyle\sum_f[v]
v∈sonu
∑f
[v]但是此時與子樹中的情況相比,小d可以先多操作一次
因此,f[u
]=(∑
v∈so
nuf[
v])−
1f[u]= (\displaystyle\sum_f[v])−1
f[u]=(
v∈so
nu∑
f[v
])−1
那麼可以發現,小d獲勝當且僅當f[1
]=
0f[1]= 0
f[1]=0
,最後直接判斷即可,複雜度θ(n
)\theta(n)
θ(n)
。
#include
#define a 100010
using
namespace std;
int n, f[a]
, a; vector<
int> e[a]
;void
dfs(
int fr)
for(
int i =
0; i < e[fr]
.size()
; i++)if
(f[fr]
) f[fr]--;
}int
main
(int argc,
char
const
*ar**)