CF708E Student's Camp

麻麻我会做*3100的计数了,我出息了

考虑朴素DP我们怎么做呢。
(f_{i,l,r})为第(i)层选择(l,r)的依旧不倒的概率。
(q(l,r))表示经历了(k)天后,存活下来的区间为([l,r])的概率。
发现其可以转为前缀后缀形式。
即前缀删掉了(l - 1)个,后缀删了(m - r)个。
而删掉的过程是独立的。
那么删掉(i)个的概率为(d(i))
显然有(d(i) = inom{i}{k}p^{i} imes ({1 - p})^{k - i})
那么有(q(l,r) = d(l - 1) * d(m - r))
那么有(f_{i,l,r} = q(l,r) * (sum f_{i - 1,li,ri} ([li,ri] 交于 [l,r])))
直接暴力枚举([li,ri],[l,r])这样是(O(nm^4))
考虑我们并不需要枚举([li,ri]),此时我们考虑容斥。
(S(i) = sum f_{i,l,r})
那么有不交([l,r])的区间的和为(S(i - 1) - sum{f_{i,li,ri}(ri < li)} - sum{f_{i,li,ri}(li > ri)})
那么不妨记录对(r)记录前缀和,对(l)记录后缀和。
那么设(pre(i,j) = sum (f_{i,l,r} (r <= j)))
(fail(i,j) = sum (f_{i,l,r} (l >= j)))
那么改写原柿子,(f_{i,l,r} = (d(l - 1) * d(m - r)) * (S(i - 1) - pre(i - 1,l - 1) - fail(i - 1,r + 1))
利用前缀后缀和,则可以做到(O(nm^2))
考虑我们接着优化,因为我们发现,实际上我们并不关心每个([l,r])的答案是什么。
我们只关心以(l)开头的,和以(r)结尾的dp值的和,以及全局答案。
那么启示我们枚举(l),并用某种后缀和计算一次性处理后缀(r)
我们考虑拆项。
((d(l - 1) * d(m - r)) * (S(i - 1) - pre(i - 1,l - 1) - fail(i - 1,r + 1) = d(l - 1) * S(i - 1) * d(m - r) - pre(i - 1,l - 1) * d(l - 1) * d(m - r) - fail(i - 1,r + 1) * d(m -r) * d(l - 1))
那么只要维护(sum pre(i - 1,l) * d(l),fail(i - 1,r + 1) * d(m - r),d(l),d(r))即可。

原文地址:https://www.cnblogs.com/dixiao/p/15509454.html