一类树形dp & 点分治题目总结

题目链接:

1、https://blog.csdn.net/weixin_44059127/article/details/104093004 路径权值和(异或)
2、https://blog.csdn.net/weixin_44059127/article/details/104098526 路径权值和(奇偶)
3、https://blog.csdn.net/weixin_44059127/article/details/104093821 路径权值和(模 5)

4、https://blog.csdn.net/weixin_44059127/article/details/103314476 点分治 + 逆元
5、https://blog.csdn.net/weixin_44059127/article/details/104074195 点分治 + 二维偏序
6、https://blog.csdn.net/weixin_44059127/article/details/104065007 点分治 + f f t fft fft
7、https://blog.csdn.net/weixin_44059127/article/details/104906347 点分治 + m o b i u s mobius mobius

总结:

点分治可以高效处理树上 n 2 n^2 n2 条路径,代价为一个 l o g log log,将树上路径问题转化为序列组合的求解问题,这样的子问题大体上可分为计数以及解的存在性判定两类,分别适应于点分治的两种写法。

对于计数类的子问题,诸如路径权值和小于 k k k 的点对数、路径权值和为素数的点对数、点权互质的点对数 … \dots ,虽然两种点分写法都能奏效,但计数可以容斥,使用容斥写法的点分治较容易。

对于解的存在性判定类的子问题,诸如判定路径权值和为 k k k、路径权值乘积为 k k k … \dots ,若无需输出解,也可当成计数问题,否则采用非容斥的写法以便记录答案。

单独看 T 4 − T 7 T_4 - T_7 T4T7 的子问题,都是在序列上的 n 2 n^2 n2 种组合情况的问题求解,皆可在低于 O ( n 2 ) O(n^2) O(n2) 的复杂度求解,在树上可以通过点分治简化求解。

再看 T 1 − T 3 T_1 - T_3 T1T3 这类路径权值和的问题,固然可以通过点分治来求解,但注意到 c a l cal cal 过程中我们只需有限的空间保存每棵子树的有限个信息(如结点数、距当前分治点的距离和等),那么大可不必进行点分治,而是直接在原树上枚举 l c a lca lca 进行子树的组合计算,这是因为树形 d p dp dp v v v 转移到 u u u 所需的代价仅仅是这有限个信息的转移,而反观 T 4 − T 7 T_4 - T_7 T4T7 的点分治,皆需要开一个表来维护信息,并在单次分治完成后动态清空,无法在很好的时间里进行转移,故不能直接树形 d p dp dp

由于直接进行树形 d p dp dp 瓶颈在于子树信息向上合并,那么? d s u   o n   t r e e   ! dsu~on~tree~! dsu on tree ! 将重儿子的信息向上合并,轻儿子暴力,关键在于信息必须可在全局维护,如 T 7 T_7 T7 的互质点对,通过逐次添加子树处理组合答案(当然子树询问完再一次全部加入,防止子树内部的错误组合),那么本质上也是在原树中的 l c a lca lca 处分治。又如洛谷上的点分治模板,询问距离为 k k k 的路径是否存在,显然也可以通过启发式合并重儿子信息来直接在原树上处理组合答案,那么关键在于距离信息的全局维护,可以通过将 d i s ( u , v ) dis(u, v) dis(u,v) 改写为 d i s ( u , r t ) + d i s ( v , r t ) − 2 ∗ d i s ( l c a ( u , v ) , r t ) dis(u, rt) + dis(v, rt) - 2 * dis(lca(u, v), rt) dis(u,rt)+dis(v,rt)2dis(lca(u,v),rt),进而只需 d i s ( u , r t ) dis(u, rt) dis(u,rt) 的全局不变量进行转移。

你可能感兴趣的:(图论,#,树形dp与树分治)