LOJ #3405. 「2020-2021 集训队作业」Gem Island 2

题意就是有n个人,d天。
初始每个人有一个宝石。然后每天选一颗宝石复制一份。
d天后,宝石数量前r大的人所拥有宝石数量总和的期望。
1rn1.5×107,1d1.5×107

首先考虑弱化版,O(n3)的做法。
这需要一个转换:考虑一个最终状态a1,a2anai表示这d天第i个人复制出来的宝石。
计算它出现的次数为(dai)×ai!
发现就是d!。那么所有a的概率都一样。
那么问题转换为计数a的个数(这个值就是(d+n1n1)),并计算所有a中前r大的钻石数量。
这个可以用一个DP完成。
就是设f[i][j]表示有j个人为当前宝石数量并列最多,已经过了i天,在这个状态下的方案数。

下面考虑优化。用式子去表达答案。
就是i=1nmin(i,r)j=1dFi,j
Fi,j表示恰好有i个人至少有j个钻石。
这个F显然可以用二项式反演。
Gi,j表示至少有i个人至少有j个钻石。
那么Gi,j=(ni)(dij+n1n1)
反演得Fi,j=k=in(1)ki(ki)Gk,j
G,F都带入到原式可得:
i=1nmin(i,r)j=1dk=in(1)ki(ki)(nk)(dkj+n1n1)

整理可变成k=1n(nk)i=1k(1)kimin(i,r)(ki)j=1d(dkj+n1n1)

考虑设Qi表示i|jd(dj+n1n1)
Pi表示j=1i(1)ijmin(j,r)(ij)

原始就变成了k=1n(nk)PkQk
显然Q是可以用高维前缀和O(nloglogn)解决的。
注意:这里可以发现Q与原始不同,多了j=0情况。意义上就是把初始钻石也加上了。所以就不用在最后加n了。

然后瓶颈在于处理P
仍然考虑推式:
j=1i(1)ijmin(j,r)(ij)
l=1rj=li(1)ij(ij)
i=0n(1)i(ni)=0可推得。
(1)il=1rj=0l1(1)j(ij)
类推上面等式,玩杨辉三角可推得
(1)il=1r(1)l(i1l1)
(1)il=0r1(1)l(i1l)
(1)i+r(i2r1)
所以Pi=(1)i+r(i2r1)。预处理组合数后O(1)计算。
所以最大复杂度就是处理Qmloglogm,其他都是线性。

posted @   sjcx  阅读(141)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示