CF2217H 题解 发表于 2026-04-08 | 更新于 2026-04-13
| 阅读量:
前言
懒得喷。。。。。。
更可爱的阅读体验
思路
考虑树形 dp。在 dp 过程中枚举每个点的状态:没有进行交换,跟父亲交换或是跟某个儿子交换。将其记在状态里,用 f u , 0 f_{u,0} f u , 0 代表不交换,f u , 1 f_{u,1} f u , 1 代表跟父亲交换,f u , i + 2 f_{u,i+2} f u , i + 2 代表跟第 i i i 个儿子交换(下标从 0 0 0 开始)。有如下转移:
{ f u , 0 = ∑ v ∈ s o n ( u ) max ( f v , 0 + [ a u = a v ] w u , max x ≥ 2 { f v , x + [ a u = a s o n ( v ) x ] w u } ) f u , 1 = ∑ v ∈ s o n ( u ) max ( f v , 0 + [ a f a u = a v ] w f a u , max x ≥ 2 { f v , x + [ a f a u = a s o n ( v ) x ] w f a u } ) f u , i ( i ≥ 2 ) = f s o n ( u ) i , 1 + ∑ v ∈ s o n ( u ) , v ≠ s o n ( u ) i max ( f v , 0 + [ a s o n ( u ) i = a v ] w s o n ( u ) i , max x ≥ 2 { f v , x + [ a s o n ( u ) i = a s o n ( v ) x ] w s o n ( u ) i } ) \begin{cases}
f_{u,0}=\sum\limits_{v\in son(u)}\max(f_{v,0}+[a_u=a_{v}]w_u,\max\limits_{x\geq 2}\{f_{v,x}+[a_u=a_{son(v)_x}]w_u\})\\
f_{u,1}=\sum\limits_{v\in son(u)}\max(f_{v,0}+[a_{fa_u}=a_{v}]w_{fa_u},\max\limits_{x\geq 2}\{f_{v,x}+[a_{fa_u}=a_{son(v)_x}]w_{fa_u}\})\\
f_{u,i(i\geq 2)}
=f_{son(u)_i,1}+\sum\limits_{v\in son(u),v≠son(u)_i}\max(f_{v,0}+[a_{son(u)_i}=a_{v}]w_{son(u)_i},\max\limits_{x\geq 2}\{f_{v,x}+[a_{son(u)_i}=a_{son(v)_x}]w_{son(u)_i}\})
\end{cases} ⎩ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎨ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎧ f u , 0 = v ∈ s o n ( u ) ∑ max ( f v , 0 + [ a u = a v ] w u , x ≥ 2 max { f v , x + [ a u = a s o n ( v ) x ] w u } ) f u , 1 = v ∈ s o n ( u ) ∑ max ( f v , 0 + [ a f a u = a v ] w f a u , x ≥ 2 max { f v , x + [ a f a u = a s o n ( v ) x ] w f a u } ) f u , i ( i ≥ 2 ) = f s o n ( u ) i , 1 + v ∈ s o n ( u ) , v = s o n ( u ) i ∑ max ( f v , 0 + [ a s o n ( u ) i = a v ] w s o n ( u ) i , x ≥ 2 max { f v , x + [ a s o n ( u ) i = a s o n ( v ) x ] w s o n ( u ) i } )
其中为了方便,记 s o n ( u ) son(u) s o n ( u ) 代表点 u u u 所有儿子构成的集合,s o n ( u ) i son(u)_i s o n ( u ) i 代表 s o n ( u ) son(u) s o n ( u ) 集合中的第 i − 2 i\color{red}-2 i − 2 个元素,即 u u u 的第 i − 2 i\color{red}-2 i − 2 个儿子。同时用 w u w_u w u 代表原数组的 w a u w_{a_u} w a u 。
前两种转移直接暴力枚举 u u u 的儿子及其儿子的儿子即可。每个点最多被其父亲和父亲的父亲枚举两次,复杂度依旧是 O ( n ) \mathcal{O}(n) O ( n ) 。
由于每种 a a a 只在树上出现两次,因此对于第三种转移,每次只可能有一个点的一个 dp 值发生变化。对于 u u u 预处理 s u m = ∑ v ∈ s o n ( u ) max x ≠ 1 { f v , x } sum=\sum\limits_{v\in son(u)} \max\limits_{x≠1}\{f_{v,x}\} s u m = v ∈ s o n ( u ) ∑ x = 1 max { f v , x } ,枚举到儿子 v v v 时先从 s u m sum s u m 中减去 v v v 的贡献并加上 f v , 1 f_{v,1} f v , 1 ,再讨论与 v v v 配对的点是 u u u 的儿子还是 u u u 的另一个儿子的儿子即可。