gym1016231E

题意

给定(n,g,t)及序列({c_i:1le ile n})
(n)张桌子,每张可容纳的人数为(c_i)
(t)群人来吃饭,每群人数为([1,g])中随机的一个整数(x),会选一张最小的能容纳(x)个人的桌子坐下(若没有则离开)
求最后的期望人数
(n,tle 100)(g,c_ile 200)

做法

假设(c_1le c_2le cdotsle c_nle g)

考虑观察题目的性质:

  • 最后就坐的桌子,是若干段连续的区间
  • 若目前的一群人(x)人就坐,之前(le x)的人数的群体一定也就坐了

(f_{l,r})为前(r-l+1)群人,恰好就坐([l,r])的概率,枚举最后一群人就坐的位置,转移显然:

[egin{cases} f_{i,i-1}=1\ f_{l,r}=sumlimits_{k=l}^{r} frac{c_k-c_{l-1}}{g}{r-lchoose r-k}f_{l,k-1}f_{k+1,r} end{cases}]

(g_{i,j})为前(j)群人,在([1,i))就坐的概率
转移利用(f),枚举与(i-1)在一段的数量(可能为(0)),转移显然:

[egin{cases} g_{0,0}=1\ g_{i,j}=sumlimits_{len=0}^j {jchoose len}f_{i-len,i-1}cdot g_{i-len-1,j-len} end{cases}]

根据期望的线性性,计算每一张桌子(i)的贡献:

[sumlimits_{k=1}^{min(i,t)} sumlimits_{j=1,i-j+1le k}^i (frac{1}{g}sumlimits_{x=c_{j-1}+1}^{c_i}x)f_{j,i-1}cdot g_{j-1,k-(i-j+1)}sumlimits_{num=k}^{t}{tchoose num}{k-1choose i-j}(1-frac{c_i}{g})^{t-num}(frac{c_i}{g})^{num-k} ]

枚举在第(i)张桌子就坐后的这一刻,([1,i])(k)张桌子已经有人
枚举就坐后的这一刻,(i)这一极长段是以(j)开始的
枚举总共有(num)(le c_i)的人群

这样做单次是(O(n^3))的,观察最后那个(sum),稍加变形就很容易做到单次(O(n^2))了:

[egin{aligned} {k-1choose i-j}(frac{c_i}{g})^{-k}sumlimits_{num=k}^{t}{tchoose num}(1-frac{c_i}{g})^{t-num}(frac{c_i}{g})^{num}\ end{aligned}]

总复杂度(O(n^3)),但实测(O(n^4))跑得飞快

原文地址:https://www.cnblogs.com/Grice/p/14426099.html