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

定义统治区间\([l, r]\)为从第\(l\)个赌场开始,到达第\(r + 1\)个赌场,且在过程中不经过\([1, l - 1]\)的赌场。维护2种操作:

1,修改一个赌场的胜率

2,询问统治\([l, r]\)的概率

题解:

设\(f_{i}\)表示从\(x\)能走到\(n\)的概率,则有:

\[f_{i} = f_{i - 1}(1 - p_{i}) + f_{i + 1} \cdot p_{i}
\]

\[f_{i} - f[i - 1] = p_{i}(f_{i + 1} - f_{i - 1})
\]

令\(g_{i} = f_{i} - f_{i - 1} = p_{i} (g_{i} + g_{i + 1})\)(由上式得)

所以\(g_{i + 1} = g_{i} \cdot \frac{1 - p_{i}}{p_{i}}\),

令\(t_{i} = \frac{1 - p_{i}}{p_{i}}\),则\(g_{i + 1} = g_{i} t_{i}\)

显然有\(f_{n} = 1(不用走就到了), f_{0} = 0(因为已经出边界)\).

所以\(\sum_{i = 1}^{n}g_{i} = 1\),那么带入上面\(g_{i + 1} = g_{i} t_{i}\),得到:

\[g_{1} + g_{1}t_{1} + g_{1}t_{1}t_{2} + ... + g_{1}t_{1}...t_{n - 1} = 1
\]

提出\(g_{1}\).

\[g_{1}(1 + t_{1} + t_{1} t_{2} + ... + t_{1}...t_{n - 1}) = 1
\]

那么我们维护\(t\)值,就可以得到\(g_{1}\)的值。

上面是求询问区间\([1, n - 1]\)时的答案,也就是\(1\)到\(n\)的概率。

替换一下,同理可得,在询问区间\([l, r]\)时,也就是要求\(l\)到\(r + 1\)的概率,那么就有如下等式:

\[g_{l}(1 + t_{l} + t_{l}t_{l + 1} + ... + t_{l}t_{l + 1}...t_{r}) = 1
\]

用线段树维护:

对于区间\([l, r]\)维护\(t_{l} + t_{l}t_{l + 1} + ... + t_{l}t_{l + 1}...t_{r}\).然后在最后加1即可。

定义node结构体,其中x表示这个区间的\(t_{l} + t_{l}t_{l + 1} + ... + t_{l}t_{l + 1}...t_{r}\),w表示\(t_{l}t_{l + 1}...t_{r}\)

那么合并时新区间的x为\(left.x + right.x * left.w\),

w为\(left.w \cdot right.w\)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define R register int
  4. #define AC 101000
  5. #define ac 500000
  6. int n, q, w;
  7. int l[ac], r[ac];
  8. double ans, go;
  9. double tree[ac], p[AC], t[AC], sum[ac];
  10. struct node{
  11. double x, w;
  12. };
  13. inline int read()
  14. {
  15. int x = 0;char c = getchar();
  16. while(c > '9' || c < '0') c = getchar();
  17. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  18. return x;
  19. }
  20. inline void update(int x){
  21. int ll = x * 2, rr = ll + 1;
  22. sum[x] = sum[ll] * sum[rr];
  23. tree[x] = tree[ll] + tree[rr] * sum[ll];
  24. }
  25. void build(int x, int ll, int rr)
  26. {
  27. l[x] = ll, r[x] = rr;
  28. if(ll == rr) {tree[x] = sum[x] = t[ll]; return ;}
  29. int mid = (ll + rr) >> 1;
  30. build(x * 2, ll, mid), build(x * 2 + 1, mid + 1, rr);
  31. update(x);
  32. }
  33. void change(int x, int go, double w)
  34. {
  35. if(l[x] == r[x]){sum[x] = tree[x] = w; return ;}
  36. int mid = (l[x] + r[x]) >> 1;
  37. (go <= mid) ? change(x * 2, go, w) : change(x * 2 + 1, go, w);
  38. update(x);
  39. }
  40. node find(int x, int ll, int rr)
  41. {
  42. if(l[x] == ll && r[x] == rr) return (node){tree[x], sum[x]};
  43. int mid = (l[x] + r[x]) >> 1;
  44. if(rr <= mid) return find(x * 2, ll, rr);
  45. else if(ll > mid) return find(x * 2 + 1, ll, rr);
  46. else
  47. {
  48. node now = find(x * 2, ll, mid), y = find(x * 2 + 1, mid + 1, rr);
  49. now.x = now.x + y.x * now.w, now.w = now.w * y.w;//要更新now.w!!!
  50. return now;
  51. }
  52. }
  53. void pre()
  54. {
  55. n = read(), q = read();
  56. for(R i = 1; i <= n; i ++)
  57. {
  58. double a = read(), b = read();
  59. p[i] = a / b;
  60. }
  61. for(R i = 1; i <= n; i ++) t[i] = (1 - p[i]) / p[i];
  62. }
  63. void work()
  64. {
  65. int opt, a, b, x;
  66. for(R i = 1; i <= q; i ++)
  67. {
  68. opt = read();
  69. if(opt == 1)
  70. {
  71. x = read(), a = read(), b = read(), go = 1.0 * a / b;
  72. go = (1 - go) / go, change(1, x, go);
  73. }
  74. else
  75. {
  76. a = read(), b = read();
  77. node x = find(1, a, b);
  78. // printf("%lf\n", x.x);
  79. printf("%.10lf\n", 1 / (1 + x.x));
  80. }
  81. }
  82. }
  83. int main()
  84. {
  85. freopen("in.in", "r", stdin);
  86. pre();
  87. build(1, 1, n);
  88. work();
  89. fclose(stdin);
  90. return 0;
  91. }

CF712E Memory and Casinos 期望概率的更多相关文章

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

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

  2. 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 ...

  3. Codeforces Round #370 (Div. 2) E. Memory and Casinos 线段树

    E. Memory and Casinos 题目连接: http://codeforces.com/contest/712/problem/E Description There are n casi ...

  4. HDU 3853 期望概率DP

    期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] ,  右移:[x][y ...

  5. 【BZOJ 3652】大新闻 数位dp+期望概率dp

    并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的 ...

  6. 【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基

    大力观察:I.从输出精准位数的约束来观察,一定会有猫腻,然后仔细想一想,就会发现输出的时候小数点后面不是.5就是没有 II.从最后答案小于2^63可以看出当k大于等于3的时候就可以直接搜索了 期望概率 ...

  7. 【BZOJ 3925】[Zjoi2015]地震后的幻想乡 期望概率dp+状态压缩+图论知识+组合数学

    神™题........ 这道题的提示......(用本苣蒻并不会的积分积出来的)并没有 没有什么卵用 ,所以你发现没有那个东西并不会 不影响你做题 ,然后你就可以推断出来你要求的是我们最晚挑到第几大的 ...

  8. 【NOIP模拟赛】黑红树 期望概率dp

    这是一道比较水的期望概率dp但是考场想歪了.......我们可以发现奇数一定是不能掉下来的,因为若奇数掉下来那么上一次偶数一定不会好好待着,那么我们考虑,一个点掉下来一定是有h/2-1个红(黑),h/ ...

  9. BZOJ2337: [HNOI2011]XOR和路径 期望概率dp 高斯

    这个题让我认识到我以往对于图上期望概率的认识是不完整的,我之前只知道正着退还硬生生的AC做过的所有图,那么现在让我来说一下逆退,一般来说对于概率性的东西都只是正推,因为有了他爸爸才有了他,而对于期望性 ...

随机推荐

  1. 【JUC源码解析】PriorityBlockingQueue

    简介 基于数据结构堆实现的线程安全的无界队列,这个堆的内存结构是数组,结合了数组和二叉树的特点. 堆 以下内容参考<编程珠玑>和<算法导论>有关堆的章节. 数据结构 堆是用来表 ...

  2. hive 数据导入

    Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...

  3. C#随堂

    顺序语句 上到下执行 分支语句 if    else switch() { case 1: Console.WriteLine(1); break; case 2: Console.WriteLine ...

  4. 三、Django之请求与响应-Part 1

    一.新建项目 进入你指定的项目保存目录,然后运行下面的命令: $ django-admin startproject mysite 这将在目录下生成一个mysite目录,也就是你的这个Django项目 ...

  5. 小白初识 - 归并排序(MergeSort)

    归并排序是一种典型的用分治的思想解决问题的排序方式. 它的原理就是:将一个数组从中间分成两半,对分开的两半再分成两半,直到最终分到最小的单位(即单个元素)的时候, 将已经分开的数据两两合并,并且在合并 ...

  6. Pycharm主菜单学习

    “工欲善其事,必先利其器”,这话我一直是这么坚信的! 找到一款顺手称心的工具,拥有它,熟练地使用它! Pycharm据说就是使用Python的一款最好的工具—— 于是,开始了第一步的学习----先从熟 ...

  7. 240. 搜索二维矩阵 II

    二维数组搜索 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 ...

  8. Paper Reading - Sequence to Sequence Learning with Neural Networks ( NIPS 2014 )

    Link of the Paper: https://arxiv.org/pdf/1409.3215.pdf Main Points: Encoder-Decoder Model: Input seq ...

  9. [T-ARA/筷子兄弟][Little Apple]

    歌词来源:http://music.163.com/#/song?id=29753511 作曲 : 筷子兄弟 [作曲 : 筷子兄弟] 作词 : K-Smith [作词 : KSmith] 编曲 : 新 ...

  10. MVC与ajax【转】

    首先我们要实现用户的注册功能.进入visual studio 点击文件->新建->项目->选择ASP.NET Web应用程序(.NET Framework)->选择的模板为MV ...