【LOJ2983】「WC2019」数树

这篇博客详细解析了LOJ2983数树问题的解决方案,包括三种操作(op=0, 1, 2)的思路和优化算法。针对op=1,通过Prufer序列和树形DP实现O(N)复杂度;对于op=2,利用分治和NTT优化达到O(NLog2N)。同时,介绍了如何运用多项式exp计算的方法。" 110450326,9552608,Eigen安装错误与Ceres冲突解决,"['Eigen库', 'ceres库', 'Linux环境', '错误处理', '软件安装']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目链接】

【思路要点】

  • o p = 0 op=0 op=0 ,算一算两棵树的公共边数即可。
  • 时间复杂度 O ( N ) O(N) O(N) O ( N L o g N ) O(NLogN) O(NLogN)
  • o p = 1 op=1 op=1 ,考虑枚举蓝树上的一个边集 S S S ,强制红树上同样存在这些边,计算将剩余 N − ∣ S ∣ N-|S| NS 个联通块连成一棵树的方案数,更新答案。
  • 上述算法中,枚举蓝树上的一个大小为 S S S 的边集后计算将剩余 N − S N-S NS 个联通块连成一棵树的方案数时,一个包含恰好 T T T 条蓝边的红树会被计算 ( T S ) \binom{T}{S} (ST) 次,并且由于最终的生成树上的蓝边数尚不确定,我们也无法得知需要乘上 y y y 的多少次方。
  • 注意到 y − T = ( y − 1 − 1 + 1 ) T = ∑ S = 0 T ( y − 1 − 1 ) S ( T S ) y^{-T}=(y^{-1}-1+1)^T=\sum_{S=0}^{T}(y^{-1}-1)^S\binom{T}{S} yT=(y11+1)T=S=0T(y11)S(ST) ,若看做每选取一条蓝边产生 × ( y − 1 − 1 ) \times(y^{-1}-1) ×(y11) 的贡献,我们就可以直接应用上述算法,只需将最终答案乘以 y N y^N yN 即可。
  • P r u f e r Prufer Prufer 序列,将 M M M 个大小分别为 a 1 , a 2 , a 3 , . . . , a M   ( ∑ a i = N ) a_1,a_2,a_3,...,a_M\ (\sum a_i=N) a1,a2,a3,...,aM (ai=N) 的联通块连成一棵树的方案数为 N M − 2 ∏ a i N^{M-2}\prod a_i NM2ai N M − 2 N^{M-2} NM2 部分的贡献可以看做每选取一条蓝边产生 × N − 1 \times N^{-1} ×N1 的贡献,最后将答案乘以 N N − 2 N^{N-2} NN2 ∏ a i \prod a_i ai 部分的贡献对应的组合意义为在每一个联通块内选择恰好一个代表点的方案数。
  • 至此,我们可以设计一个简单树形 d p dp dp 来加速上述枚举算法。
  • 即记 d p i , 0 / 1 dp_{i,0/1} dpi,0/1 表示 i i i 所在联通块有/没有选出代表点的情况下,其子树内上述算法所有情况的贡献总和,可以 O ( 1 ) O(1) O(1) 简单转移。
  • 时间复杂度 O ( N ) O(N) O(N)
  • o p = 2 op=2 op=2 ,由 o p = 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值