题目链接

大意

给出一个序列,当你在某个点时,有一个向右走的概率\(P_i\)(向左为\(1-P_i\)),

给出\(M\)个操作,操作有两类:

1 X Y Z:把\(P_X\)的值修改为\(\frac{Y}{Z}\)

2 L R:询问你从\(L\)出发,随机游走,在不经过\(L-1\)的情况下到达\(R+1\)的概率

思路

我们对于一个区间设有两个值\(ValL,ValR\),

分别表示从这段区间的左端点出发能赢的概率与从它的右端点出发能赢的概率。

即我们要求的是任意区间的\(ValL\).

考虑一个区间的\(Val\)如何从它的两个子区间转移而来。

首先对于\(ValL\)

肯定有一个\(S1.ValL\times S2.ValL\),表示从\(S1\)的左端点出发到达\(S2\)左端点,再到\(R+1\),但是明显会漏掉在\(S1,S2\)间反复横跳的情况。

我们不妨枚举一下它横跳的次数来计算

\[\sum_{i=0}^{\infty}S1.ValR^i\times (1-S2.ValL)^i
\]

化简为$$\frac{1}{1-S1.ValR\times (1-S2.ValL)}$$

即$$ValL=\frac{S1.ValL\times S2.ValL}{1-S1.ValR\times (1-S2.ValL)}$$


同理,对于\(ValR\),也有横跳的情况,但向左向右横跳的次数就有差距了。

\[(1-S2.ValR)\times S2.ValL\times \sum_{i=0}^{\infty}S1.ValR^{i+1}\times (1-S2.ValL)^i
\]

化简为$$\frac{(1-S2.ValR)\times S2.ValL\times S1.ValR}{1-S1.ValR\times (1-S2.ValL)}$$

同时,\(ValR\)也有不横跳的情况,即\(S2.ValR\).

综合一下

\[ValR=S2.ValR+\frac{(1-S2.ValR)\times S2.ValL\times S1.ValR}{1-S1.ValR\times (1-S2.ValL)}
\]

对于ValL与ValR,可以使用线段树维护。

代码

没打重载,暴力合并

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. #define fi first
  5. #define se second
  6. const double ONE=1.0;
  7. const int MAXN=100005;
  8. const int INF=0X3F3F3F3F;
  9. int N,Q;
  10. double P[MAXN];
  11. struct Node{
  12. int l,r;pair<double,double>val;
  13. }s[MAXN*8];
  14. void Push_Up(int rt){
  15. pair<double,double>ret1=s[rt*2].val,ret2=s[rt*2+1].val;
  16. s[rt].val.fi=ret1.fi*ret2.fi/(1-ret1.se*(1-ret2.fi));
  17. s[rt].val.se=ret2.se+(1-ret2.se)*ret2.fi*ret1.se/(1-ret1.se*(1-ret2.fi));
  18. }
  19. void Build(int rt,int l,int r){
  20. s[rt].l=l;s[rt].r=r;
  21. s[rt].val.fi=s[rt].val.se=-INF;
  22. if(l==r){
  23. s[rt].val.fi=P[l];
  24. s[rt].val.se=P[l];
  25. return ;
  26. }
  27. int mid=(l+r)/2;
  28. Build(rt*2,l,mid);
  29. Build(rt*2+1,mid+1,r);
  30. Push_Up(rt);
  31. }
  32. void Insert(int rt,int p,double val){
  33. if(s[rt].l>p||s[rt].r<p)return ;
  34. if(s[rt].l==s[rt].r){s[rt].val.fi=s[rt].val.se=val;return ;}
  35. Insert(rt*2,p,val);Insert(rt*2+1,p,val);Push_Up(rt);
  36. }
  37. pair<double,double>Query(int rt,int l,int r){
  38. pair<double,double>ret;ret.fi=ret.se=-INF;
  39. if(s[rt].l>r||s[rt].r<l)return ret;
  40. if(s[rt].l>=l&&s[rt].r<=r)return s[rt].val;
  41. pair<double,double>ret1,ret2;
  42. ret1=Query(rt*2,l,r);
  43. ret2=Query(rt*2+1,l,r);
  44. if(ret1.fi==-INF&&ret2.fi==-INF)return ret;
  45. if(ret1.fi==-INF)ret=ret2;
  46. else if(ret2.fi==-INF)ret=ret1;
  47. else{
  48. ret.fi=ret1.fi*ret2.fi/(1-ret1.se*(1-ret2.fi));
  49. ret.se=ret2.se+(1-ret2.se)*ret2.fi*ret1.se/(1-ret1.se*(1-ret2.fi));
  50. }
  51. return ret;
  52. }
  53. int main(){
  54. scanf("%d%d",&N,&Q);
  55. for(int i=1,A,B;i<=N;i++){
  56. scanf("%d%d",&A,&B);
  57. P[i]=ONE*A/B;
  58. }
  59. Build(1,1,N);
  60. for(int i=1,k,x,y,z;i<=Q;i++){
  61. scanf("%d%d%d",&k,&x,&y);
  62. if(k==1){
  63. scanf("%d",&z);
  64. Insert(1,x,ONE*y/z);
  65. }
  66. if(k==2)printf("%.10f\n",Query(1,x,y).fi);
  67. }
  68. return 0;
  69. }

【CF712E】Memory and Casinos(数学 期望 DP)的更多相关文章

  1. codeforces1097D Makoto and a Blackboard 数学+期望dp

    题目传送门 题目大意: 给出一个n和k,每次操作可以把n等概率的变成自己的某一个因数,(6可以变成1,2,3,6,并且概率相等),问经过k次操作后,期望是多少? 思路:数学和期望dp  好题好题!! ...

  2. lightoj1038(数学期望dp)

    题意:输入一个数N,N每次被它的任意一个因数所除 变成新的N 这样一直除下去 直到 N变为1 求变成1所期望的次数 解析: d[i] 代表从i除到1的期望步数:那么假设i一共有c个因子(包括1和本身) ...

  3. 【BZOJ4872】[Shoi2017]分手是祝愿 数学+期望DP

    [BZOJ4872][Shoi2017]分手是祝愿 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n ...

  4. BZOJ 1426: 收集邮票 数学期望 + DP

    Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且 买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡 ...

  5. CF712E Memory and Casinos 期望概率

    题意:\(n\)个赌场,每个赌场有\(p_{i}\)的胜率,如果赢了就走到下一个赌场,输了就退回上一个赌场,规定\(1\)号赌场的上一个是\(0\)号赌场,\(n\)号赌场的下一个是\(n + 1\) ...

  6. CF708E-Student‘s Camp【数学期望,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/CF708E 题目大意 有\(n*m\)的矩形网格,然后每次每行最左边和最右边的格子各有\(p=\frac{c}{d} ...

  7. Codeforces Round #370 (Div. 2) E. Memory and Casinos (数学&&概率&&线段树)

    题目链接: http://codeforces.com/contest/712/problem/E 题目大意: 一条直线上有n格,在第i格有pi的可能性向右走一格,1-pi的可能性向左走一格,有2中操 ...

  8. CF712E Memory and Casinos

    设\(f[i]\)为从\(i\)到\(r+1\)且不走出区间的概率 \(f[i]=p[i]f[i+1]+(1-p[i])f[i-1]\) \(f[i]-f[i-1]=p[i](f[i+1]-f[i-1 ...

  9. [题解]数学期望_luogu_P1850_换教室

    数学期望dp,题面第一次见很吓人,然而从CCF语翻译成人话就简单多了, 开始一般会想到用 f [ i ] [ j ]表示前 i 个课程申请 j 次的期望,然而其实会发现转移的时候还和上一次的情况有关( ...

随机推荐

  1. APP自动化,怎样让应用不重置?

    noReset =True产生的背景: 在编写APP自动化代码时,除了登录用例需要填写账号和密码外,其余很多用例都是需要先登录再操作的,如果每一个用例都从头开始到具体的操作,这样将会耗费很多时间,此时 ...

  2. WebLogic任意文件上传漏洞(CVE-2019-2725)

    一,漏洞介绍 1.1漏洞简介 Oracle weblogic反序列化远程命令执行漏洞,是根据weblogic的xmldecoder反序列化漏洞,只是通过构造巧妙的利用链可以对Oracle官方历年来针对 ...

  3. 创客系列教程——认识LED灯

    认识LED灯 一.初识LED灯   LED灯是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光.LED灯逐步融入到生活中的方方面面:室内外的照明.电子指示牌.酷炫的舞台灯光.车辆的 ...

  4. Anaconda3+CUDA10.1+CUDNN7.6+TensorFlow2.6安装(Ubuntu16)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. 百度地图BMap实现在行政区域内做标注

    使用环境 vue bmap.js element-ui 页面展示 前提步骤 在index中引入百度地图提供的js库 在使用的vue页面中实例化地图 <!-- 给id随便起给名字 --> & ...

  6. 原生JS获取网页宽高

    网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offset ...

  7. 《剑指offer》面试题36. 二叉搜索树与双向链表

    问题描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜 ...

  8. 遇到奇怪的问题:web.py 0.40中使用web.input(),出现一堆奇怪的错误

    有的请求很正常,有的请求就出现了500错误. 这里使用POST请求,然后在web.input()中出现了很长很长的错误. 猜测是这个机器上安装了python2.7 / python 3.6 / pyt ...

  9. 539. Minimum Time Difference

    Given a list of 24-hour clock time points in "Hour:Minutes" format, find the minimum minut ...

  10. 小程序循环时的item问题

    平常在做小程序时,比如循环渲染数据时,如果有多个数据层次,一般都会这样 wx:for-item=item2,它的意思只是简单的起了一个wx:for循环值的别名,不是表示循环item2,index2同理 ...