Rikka with Match

Rikka with Match

某人号 Sam 尝曰:最大独立集乃树上背包也。

余曰:误人子弟。最大独立集乃贪心也。

Rikka with Match。

给定 nn 个点的树,求有多少中割边的方案使得最大匹配大小被 mm 整除。

n≤5×104,m≤200n\le 5\times10^4,m\le 200。

将最大匹配转化为最大独立集后,首先我们应该想如何刻画最大独立集:

贪心:

按深度从大到小选择点。只要这个点可以选择就选择。

那么我们就可以得出一个 DP 状态并利用上述贪心转移:定义 fi,j,kf_{i,j,k} 为 ii 的子树,最大独立集模 mm 为 jj,且 ii 选择/不选择的方案数。

然后初始化是比较简单的,因为按照贪心,一开始是时候只有 ii 一个点,于是必须选择,那么就有 fx,1,1=1f_{x,1,1}=1,其余为 00。

考虑仿照树形背包,逐步加入儿子 uu。

那么对于儿子 uu,我既可以断掉这条边,也可以不断。

Case #1:断

这个时候 uu 的选择就与 xx 无关了,那么只需要对第二维进行树形背包即可(注意,我写的所有转移的第二维都是在模意义下的):

fx,i,0/1←∑j+k=ifx,j,0/1(fu,k,0+fu,k,1)f_{x,i,0/1}\leftarrow\sum_{j+k=i}f_{x,j,0/1}(f_{u,k,0}+f_{u,k,1})

Case #2:不断

此时 uu 的选择就会影响 xx 了。

那么不妨枚举 xx 的状态 pp 和 uu 的状态 qq。

Case #2.1

若 p=0p=0,则 xx 必然不会被选择,那么此时 uu 的状态 qq 就不会有影响了,因此有转移:

fx,i,0←∑j+k=ifx,j,0(fu,k,0+fu,k,1)f_{x,i,0}\leftarrow\sum_{j+k=i}f_{x,j,0}(f_{u,k,0}+f_{u,k,1})

Case #2.2

若 p=1,q=0p=1,q=0,则根据贪心,此时 xx 依然继续选择,因此:

fx,i,1←∑j+k=ifx,j,1fu,k,0f_{x,i,1}\leftarrow\sum_{j+k=i}f_{x,j,1}f_{u,k,0}

Case #2.3

若 p=1,q=1p=1,q=1,那么此时根据贪心,xx 的状态要有选择变为不选择,即,最大独立集的大小会 −1-1。

那么同样的,我们也可以得出转移:

fx,i−1,0←∑j+k=ifx,j,1fu,k,1f_{x,i-1,0}\leftarrow\sum_{j+k=i}f_{x,j,1}f_{u,k,1}

总结

上面的四种转移转移完成后,这题就可以以 O(nm2)\mathcal{O}(nm^2) 的复杂度完成,预期得分 5050。

然后就是一个可能会被遗忘的优化:这个转移本质上只是树形背包的变体,因此只需要在转移的时候,将上界 mm 换成 min⁡{m,szx}\min\{m,sz_x\} 和 min⁡{m,szu}\min\{m,sz_u\} 就行了。

这样就可以做到 O(nm)\mathcal{O}(nm) 了。