CF960E Alternating Tree

树上 DP。

考虑每一条经过 uu 的路径的走向,可分为 33 类。

  • 子树 u\rightarrow u\rightarrow 其他。

  • 其他 u\rightarrow u\rightarrow 子树。

  • 子树 u\rightarrow u\rightarrow 子树。

我们设 s[u][0]s[u][0] 表示以 uu 为根的子树中距离 uu 为偶数的点数,s[u][1]s[u][1] 表示以 uu 为根的子树中距离 uu 为奇数的点数。

  • 对于情况 11,贡献为 (s[u][0]s[u][1])×w[u]×(nsz[u]+1)(s[u][0]-s[u][1])\times w[u]\times(n-sz[u]+1)w[u]w[u] 表示点权,sz[u]sz[u] 表示子树节点数。

  • 对于情况 22,我们要统计 uu 上方(即深度小于 uu)的距离 uu 为奇数或偶数的点数,分别为 f[u][0]f[u][0]f[u][1]f[u][1],那么贡献为 (f[u][0]f[u][1])×w[u]×sz[u](f[u][0]-f[u][1])\times w[u]\times sz[u],考虑计算 ff,我们将节点按照深度排序之后就有 f[u][0]=f[fa[u]][1]+s[fa[u]][1]s[u][0],f[u][1]=f[fa[u]][0]+s[fa[u]][0]s[u][1]f[u][0]=f[fa[u]][1]+s[fa[u]][1]-s[u][0],f[u][1]=f[fa[u]][0]+s[fa[u]][0]-s[u][1]

  • 对于情况 33,贡献为 (s[v][1]s[v][0])×w[u]×(sz[u]sz[v]1)+(sz[u]1)×w[u](s[v][1]-s[v][0])\times w[u]\times(sz[u]-sz[v]-1)+(sz[u]-1)\times w[u],分别表示 uu 子树向下和 uu 节点向下。

没了,坑点主要在于关于 uu 自身的讨论。

code