CF960E Alternating Tree

CF960E:

也许是第一道自己做的 *2300。

可简化为树上黑白染色。

首先想到树形DP,如果是棵有根树,状态转移方程如下:

\[{f[x][0]=f[y][1]+siz[y]*a[x]} \]

\[f[x][1]=f[y][0]-siz[y]*a[x] \]

\(siz[x]\) 表示子树大小,\(f[x][0/1]\) 表示当前点颜色为 \(0/1\) 时的答案。

因为对于子树中每个点都会有一条路径,所以每新加入一个点 \(x\),贡献为 \(siz[x]*a[x]*(-1)^{0/1}\)

现在就有了一个 \(O(n^2)\) 的做法。

考虑换根。

\(g[x][0/1]\) 表示以当前点为根时的答案。

转移方程如下:

\[g[y][0]=g[x][1]+siz[y]*a[x]+(n-siz[y])*a[y] \]

\[g[y][1]=g[x][0]-siz[y]*a[x]-(n-siz[y])*a[y] \]

时间复杂度 \(O(n)\)

code

posted @ 2022-10-17 08:50  awlgot  阅读(22)  评论(0)    收藏  举报