zoukankan      html  css  js  c++  java
  • 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))即可。

  • 相关阅读:
    04-Bootstrap的插件
    03-Bootstrap学习
    02-移动端单位介绍
    01 响应式页面-@media介绍,
    14-jQuery补充
    13-jQuery的ajax
    12-事件委托(事件代理)
    11-jQuery的事件绑定和解绑
    10-事件对象
    09-JS的事件流的概念(重点)
  • 原文地址:https://www.cnblogs.com/dixiao/p/15509454.html
Copyright © 2011-2022 走看看