题意

每次询问一段区间[l,r],求从最左边走到最右边(r+1)的概率(若走到l-1,则GG了),每个点上写有向右走的概率。支持单点修改。


思考

若只查询一次,那只要知道每个点在不走到l-1的情况下,向右移动一格的概率就行了,最后乘起来就是答案。

但我们忽略了一件事情,若从一个区间的某一点出发,从左边走出去和右边走出去的概率和为1(不可能停在中间),于是我们要设计一个状态,并能够合并,这样才有可能优化复杂度。

设 [l,r] 区间的L为从第l个点(最左边)出发,在右边走出去的概率,R为第R个点出发,在左边走出去的概率。

[L1 --> R1] [L2 --> R2]
[ L -- -- -- --> R ]

请记住,他们每个的实际意义。因为每个点要么从左边走出去,要么从右边走出去,所(1-L1)的实际意义就是从(左边出发,不从右边走出),即(从左边出发,从左边走出去的概率)。

那么若有两个连续的区间,合并成一个新区间会有怎样的答案? 设左右两个区间的答案分别为L1,R1,L2,R2,则:

L   =       L1*L2                                                                      走到右边还要再走到更右边

+   L1(1-L2)(1-R1)*L2                                               第一次向右边走失败了,再退回来再向右走

+   L1(1-L2)(1-R1)(1-L2)(1-R1)*L2                         反反复复.......

+.......

整理一下,
                   L   =   L1L2+L1L2(1-L2)(1-R1)+L1L2(1-L2)2+.......
(1-L2)(1-R1)L   =   L1L2(1-L2)(1-R1)+L1L2(1-L2)2+.......

作差,

L(1-(1-L2)(1-R1))=L1L2

L=L1L2/(1-(1-L2)(1-R1))

R也可以类似地得到,但注意它们的和不一定为1,因为是两个不同的端点。

简单地线段树维护。


代码

 #include<bits/stdc++.h>
using namespace std;
const int maxn=1E5+;
int n,m;
double x,y,a[maxn];
struct tree{int l,r;double L,R;}t[maxn*];
tree merge(tree x,tree y)
{
tree z;
z.l=x.l;z.r=y.r;
z.L=x.L*y.L/(-(-y.L)*(-x.R));
z.R=x.R*y.R/(-(-y.L)*(-x.R));//不要认为反一反就对了QAQ
return z;
}
void build(int l,int r,int num)
{
t[num].l=l,t[num].r=r;
if(l==r)
{
t[num].L=a[l];
t[num].R=-a[l];
return;
}
int mid=(l+r)>>;
build(l,mid,num*);build(mid+,r,num*+);
t[num]=merge(t[num*],t[num*+]);
}
void change(int pos,double val,int num)
{
if(t[num].l==t[num].r)
{
t[num].L=val;
t[num].R=-val;
return;
}
int mid=(t[num].l+t[num].r)>>;
if(pos<=mid)change(pos,val,num*);
else change(pos,val,num*+);
t[num]=merge(t[num*],t[num*+]);
}
tree ask(int L,int R,int num)
{
if(L<=t[num].l&&t[num].r<=R)return t[num];
int mid=(t[num].l+t[num].r)>>;
if(R<=mid)return ask(L,R,num*);
else if(mid<L)return ask(L,R,num*+);
else return merge(ask(L,R,num*),ask(L,R,num*+));
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<=n;++i)
{
cin>>x>>y;
a[i]=x/y;
}
build(,n,);
while(m--)
{
int opt,d;
cin>>opt;
if(opt==)
{
cin>>d>>x>>y;
change(d,x/y,);
}
else
{
int l,r;
cin>>l>>r;
cout<<fixed<<setprecision()<<ask(l,r,).L<<endl;
}
}
return ;
}

CF712E [Memort and Casinos]的更多相关文章

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

  2. CF712E Memory and Casinos 期望概率

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

  3. 「CF712E」Memory and Casinos「线段树」「概率」

    题解 解法1:(官方做法) 一段区间的\(L\)定义为从最左边开始出发,最左不失败,一直到最右边胜利的概率,\(R\)定义为从最右边开始出发,最左不失败,又回到最右边胜利的概率 考虑一个区间\([l, ...

  4. 【CF712E】Memory and Casinos(数学 期望 DP)

    题目链接 大意 给出一个序列,当你在某个点时,有一个向右走的概率\(P_i\)(向左为\(1-P_i\)), 给出\(M\)个操作,操作有两类: 1 X Y Z:把\(P_X\)的值修改为\(\fra ...

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

  6. Codeforces 712E Memory and Casinos

    Description There are n casinos lined in a row. If Memory plays at casino \(i\), he has probability ...

  7. cf 712E Memory and Casinos

    题意:有一行$n(n \leq 100000)$个方格,从左往右第$i$个方格的值为$p_i(p_i = \frac{a}{b}, 1 \leq a < b \leq 1e9)$,有两种操作,一 ...

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

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

  9. 挖坑:CF712E

    #include<cstdio> #include<cstring> #include<algorithm> #define maxn 1000005 using ...

随机推荐

  1. Linux下HBase和Maven的环境搭建

    Maven环境部署如下: maven下载并进行环变量配置 export MAVEN_HOME=/home/hadoop/app/apache-maven-3.3.9export PATH=$MAVEN ...

  2. chkconfig命令参数

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...

  3. Codeforces 1005 E2 - Median on Segments (General Case Edition)

    E2 - Median on Segments (General Case Edition) 思路: 首先我们计算出solve(m):中位数大于等于m的方案数,那么最后答案就是solve(m) - s ...

  4. Netty实现简易http_server

    Netty可以通过一些handler实现简单的http服务器.具体有三个类,分别是HttpServer.java.ServerHandlerInit.java.BusiHandler.java. 具体 ...

  5. [JSP] Action Tags

    1.: forward转发请求to another resource (可能是jsp, html,等). 语法: <jsp:forward page="relativeURL | &l ...

  6. [Spring] Aspect Oriented Programming with Spring | AOP | 切面 | 切点

    使用Spring面向切面编程 1.介绍 AOP是OOP的补充,提供了另一种关于程序结构的思路. OOP的模块化的关键单位是 类 . AOP的则是aspect切面. AOP 将程序的逻辑分成独立的块(叫 ...

  7. Ubuntu终端多窗口分屏Terminator

    1.安装 Terminator最大的特点就是可以在一个窗口中打开多个终端 sudo apt-get install terminator 2.快捷键 Ctrl+Shift+E    垂直分割窗口 Ct ...

  8. 完整的Django入门指南学习笔记4

    前言 这一章节将会全面介绍 Django 的身份认证系统,我们将实现注册.登录.注销.密码重置和密码修改的整套流程. 同时你还会了解到如何保护某些试图以防未授权的用户访问,以及如何访问已登录用户的个人 ...

  9. 『cs231n』通过代码理解风格迁移

    『cs231n』卷积神经网络的可视化应用 文件目录 vgg16.py import os import numpy as np import tensorflow as tf from downloa ...

  10. 使用formData上传文件,ajax上传

    项目是vue项目,直接贴部分代码了: html: <input type="file" name="fileTable" @change="ch ...