ことばがありあまれどなお、 このゆめはつづいて|

trsins

园龄:3年10个月粉丝:18关注:2

【做题记录】国家集训队2011 Crash的文明世界

  • 【国家集训队 2011Crash 的文明世界

    • 算法:第二类斯特林数、换根 dp

题目:

给出一棵 n 个点的树,求对于每个点 id(i) 值。

d(i)=1jnijdist(j,i)k

1n50000,1k150

题解:

首先对于第二类斯特林数有一个性质:

nk=i=0k{ki}(ni)i!

这个性质很显然。nk 表示将 k 个球放入 n 个盒子。

然后枚举 k 个球放入盒子的盒数,即 i。然后将 k 个球放入 i 个盒子里,每个盒子非空,即为 {ki}。然后从 n 个盒子中选出 i 个盒子又有 (ni) 种,又因为盒子不同所以还要再乘上 i!

对于题目所求的式子,我们不妨将这个性质代入 dis(x,i)k,得

d(i)=1jnijl=0k{kl}(dist(x,l)l)l!=l=0kl!{kl}1jnij(dist(x,l)l)

然后题目的 k 非常小,所以对于 l=0kl!{kl} 你可以随便搞暴力,反正 l!{kl} 都可以预处理出来嘛。

因为 k 实在是太小了,所以你甚至用 {nm}={n1m1}+m{n1m} 递推式 O(k2) 都可以过。

然后观察剩下的。

不妨考虑 dp 转移,设 utri 表示 ui 的子树内,usoni 表示 ui 的其中一个儿子,那么设

dpi,j=utri(dist(i,u)j)

根据组合数最基本的式子,

(nm)=(n1m)+(n1m1)

dpi,j=usoni(dist(i,u)1j)+(dist(i,u)1j1)

dpi,j=usonidpu,j+dpu,j1

然后换根 dp,即上一次转移中的父亲成为这次转移中的儿子,最后一直推下去即可。

总的时间复杂度分两块:

  1. 预处理第二类斯特林数和阶乘,O(k2)(这里是用递推式来做的)
  2. 换根 dpO(nk)

总时间复杂度为 O(nk+k2)

本文作者:trsins

本文链接:https://www.cnblogs.com/trsins/p/15776593.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   trsins  阅读(11)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示