JZOJ 4888. 【NOIP2016提高A组集训第14场11.12】最近公共祖先

28 篇文章 0 订阅
9 篇文章 0 订阅

JZOJ 4888. 【NOIP2016提高A组集训第14场11.12】最近公共祖先

注意到每一层的结点作为 lca 的贡献是相同的。

设当前的结点的深度为 d d d, 深度为 d d d 的子树大小为 s z d sz_d szd

那么这个结点的贡献是 s z d + 1 2 k ( k − 1 ) + 2 s z d − 1 sz_{d+1}^2k(k-1)+2sz_d-1 szd+12k(k1)+2szd1

比较显然的 s z d = ∑ i = d n − 1 k i − d sz_d=\sum_{i=d}^{n-1}{k^{i-d}} szd=i=dn1kid,通过等比数列求和得 s z d = k n − d − 1 k − 1 sz_d=\frac{k^{n-d}-1}{k-1} szd=k1knd1

当然答案是 ∑ d = 0 n − 1 [ s z d + 1 2 k ( k − 1 ) + 2 s z d − 1 ] × d × k d \sum_{d=0}^{n-1}{[sz_{d+1}^2k(k-1)+2sz_d-1]\times d\times k^d} d=0n1[szd+12k(k1)+2szd1]×d×kd

化简一下
∑ d = 0 n − 1 [ s z d + 1 2 k ( k − 1 ) + 2 s z d − 1 ] × d × k d = ∑ d = 0 n − 1 [ ( k n − d − 1 − 1 k − 1 ) 2 k ( k − 1 ) + 2 k n − d − 1 k − 1 − 1 ] × d × k d = 1 k − 1 ∑ d = 0 n − 1 [ ( k n − d − 1 − 1 ) 2 k + 2 ( k n − d − 1 ) − ( k − 1 ) ] × d × k d = 1 k − 1 ∑ d = 0 n − 1 [ ( k 2 n − 2 d − 2 − 2 k n − d − 1 + 1 ) k + 2 k n − d − 2 − k + 1 ] × d × k d = 1 k − 1 ∑ d = 0 n − 1 ( k 2 n − 2 d − 1 − 2 k n − d + k + 2 k n − d − 2 − k + 1 ) × d × k d = 1 k − 1 ∑ d = 0 n − 1 ( k 2 n − d − 1 − k d ) × d \begin{aligned} &\sum_{d=0}^{n-1}{[sz_{d+1}^2k(k-1)+2sz_d-1]\times d\times k^d}\\ =&\sum_{d=0}^{n-1}{[(\frac{k^{n-d-1}-1}{k-1})^2k(k-1)+2\frac{k^{n-d}-1}{k-1}-1]\times d\times k^d}\\ =&\frac{1}{k-1}{\sum_{d=0}^{n-1}{[(k^{n-d-1}-1)^2k+2(k^{n-d}-1)-(k-1)]\times d\times k^d}}\\ =&\frac{1}{k-1}{\sum_{d=0}^{n-1}{[(k^{2n-2d-2}-2k^{n-d-1}+1)k+2k^{n-d}-2-k+1]\times d\times k^d}}\\ =&\frac{1}{k-1}{\sum_{d=0}^{n-1}{(k^{2n-2d-1}-2k^{n-d}+k+2k^{n-d}-2-k+1)\times d\times k^d}}\\ =&\frac{1}{k-1}{\sum_{d=0}^{n-1}{(k^{2n-d-1}-k^d)\times d}} \end{aligned} =====d=0n1[szd+12k(k1)+2szd1]×d×kdd=0n1[(k1knd11)2k(k1)+2k1knd11]×d×kdk11d=0n1[(knd11)2k+2(knd1)(k1)]×d×kdk11d=0n1[(k2n2d22knd1+1)k+2knd2k+1]×d×kdk11d=0n1(k2n2d12knd+k+2knd2k+1)×d×kdk11d=0n1(k2nd1kd)×d
目标,计算 ∑ d = 0 n − 1 k d × d \sum_{d=0}^{n-1}{k^d\times d} d=0n1kd×d

看似不可求解。实则可以转化。
∑ d = 0 n − 1 k d × d = ∑ d = 0 n − 1 ∑ d ′ = 0 d k d ′ = ∑ d = 0 n − 1 k d + 1 − 1 k − 1 = 1 k − 1 ( ∑ d = 0 n − 1 k d + 1 − n ) = 1 k − 1 ( k n + 1 − k k − 1 − n ) \begin{aligned} &\sum_{d=0}^{n-1}{k^d\times d}\\ =&\sum_{d=0}^{n-1}{\sum_{d'=0}^{d}{k^{d'}}}\\ =&\sum_{d=0}^{n-1}{\frac{k^{d+1}-1}{k-1}}\\ =&\frac{1}{k-1}(\sum_{d=0}^{n-1}{k^{d+1}}-n)\\ =&\frac{1}{k-1}{(\frac{k^{n+1}-k}{k-1}-n)} \end{aligned} ====d=0n1kd×dd=0n1d=0dkdd=0n1k1kd+11k11(d=0n1kd+1n)k11(k1kn+1kn)
把这个代入进去,就可以 O ( log ⁡ p ) O(\log{p}) O(logp) 求解。

题解给了一个简洁的式子,我这里就不再推导了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值