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) = \binom{i}{k}p^{i} \times ({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)\)
即可。

posted @ 2021-11-04 18:00  fhq_treap  阅读(47)  评论(0编辑  收藏  举报