ZR 1175 線上訓練 14 遊戲

2021-09-29 08:54:02 字數 1100 閱讀 9707

很思維,有點樹形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**)