CF712E [Memort and Casinos]
题意
每次询问一段区间[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]的更多相关文章
- 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 ...
- CF712E Memory and Casinos 期望概率
题意:\(n\)个赌场,每个赌场有\(p_{i}\)的胜率,如果赢了就走到下一个赌场,输了就退回上一个赌场,规定\(1\)号赌场的上一个是\(0\)号赌场,\(n\)号赌场的下一个是\(n + 1\) ...
- 「CF712E」Memory and Casinos「线段树」「概率」
题解 解法1:(官方做法) 一段区间的\(L\)定义为从最左边开始出发,最左不失败,一直到最右边胜利的概率,\(R\)定义为从最右边开始出发,最左不失败,又回到最右边胜利的概率 考虑一个区间\([l, ...
- 【CF712E】Memory and Casinos(数学 期望 DP)
题目链接 大意 给出一个序列,当你在某个点时,有一个向右走的概率\(P_i\)(向左为\(1-P_i\)), 给出\(M\)个操作,操作有两类: 1 X Y Z:把\(P_X\)的值修改为\(\fra ...
- 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 ...
- Codeforces 712E Memory and Casinos
Description There are n casinos lined in a row. If Memory plays at casino \(i\), he has probability ...
- cf 712E Memory and Casinos
题意:有一行$n(n \leq 100000)$个方格,从左往右第$i$个方格的值为$p_i(p_i = \frac{a}{b}, 1 \leq a < b \leq 1e9)$,有两种操作,一 ...
- Codeforces Round #370 (Div. 2) E. Memory and Casinos (数学&&概率&&线段树)
题目链接: http://codeforces.com/contest/712/problem/E 题目大意: 一条直线上有n格,在第i格有pi的可能性向右走一格,1-pi的可能性向左走一格,有2中操 ...
- 挖坑:CF712E
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 1000005 using ...
随机推荐
- Linux下HBase和Maven的环境搭建
Maven环境部署如下: maven下载并进行环变量配置 export MAVEN_HOME=/home/hadoop/app/apache-maven-3.3.9export PATH=$MAVEN ...
- chkconfig命令参数
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...
- Codeforces 1005 E2 - Median on Segments (General Case Edition)
E2 - Median on Segments (General Case Edition) 思路: 首先我们计算出solve(m):中位数大于等于m的方案数,那么最后答案就是solve(m) - s ...
- Netty实现简易http_server
Netty可以通过一些handler实现简单的http服务器.具体有三个类,分别是HttpServer.java.ServerHandlerInit.java.BusiHandler.java. 具体 ...
- [JSP] Action Tags
1.: forward转发请求to another resource (可能是jsp, html,等). 语法: <jsp:forward page="relativeURL | &l ...
- [Spring] Aspect Oriented Programming with Spring | AOP | 切面 | 切点
使用Spring面向切面编程 1.介绍 AOP是OOP的补充,提供了另一种关于程序结构的思路. OOP的模块化的关键单位是 类 . AOP的则是aspect切面. AOP 将程序的逻辑分成独立的块(叫 ...
- Ubuntu终端多窗口分屏Terminator
1.安装 Terminator最大的特点就是可以在一个窗口中打开多个终端 sudo apt-get install terminator 2.快捷键 Ctrl+Shift+E 垂直分割窗口 Ct ...
- 完整的Django入门指南学习笔记4
前言 这一章节将会全面介绍 Django 的身份认证系统,我们将实现注册.登录.注销.密码重置和密码修改的整套流程. 同时你还会了解到如何保护某些试图以防未授权的用户访问,以及如何访问已登录用户的个人 ...
- 『cs231n』通过代码理解风格迁移
『cs231n』卷积神经网络的可视化应用 文件目录 vgg16.py import os import numpy as np import tensorflow as tf from downloa ...
- 使用formData上传文件,ajax上传
项目是vue项目,直接贴部分代码了: html: <input type="file" name="fileTable" @change="ch ...