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 ...
随机推荐
- ubuntu 18.04编译opencv3.4.3 with python3.6 cuda9.2 gdal
惭愧,之前一直没在linux下编译过opencv,也没用过纯命令行版的cmake,现在咬牙编译一次.其实感觉还凑合. opencv官网文档还是那么烂:https://docs.opencv.org/m ...
- Qt5鼠标事件及实例
mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLa ...
- mac软件
1. http://www.ifunmac.com/ 2.Mac安装软件时提示已损坏的解决方法 http://www.jianshu.com/p/3d04a2292fcd 3.mac以后有时间在装的软 ...
- (转)C# 的三种序列化方法
序列化是将一个对象转换成字节流以达到将其长期保存在内存.数据库或文件中的处理过程.它的主要目的是保存对象的状态以便以后需要的时候使用.与其相反的过程叫做反序列化. 序列化一个对象 为了序列化一个对象, ...
- 亚马逊商品页面的简单爬取 --Pyhon网络爬虫与信息获取
1.亚马逊商品页面链接地址(本次要爬取的页面url) https://www.amazon.cn/dp/B07BSLQ65P/ 2.代码部分 import requestsurl = "ht ...
- numpy---one
import numpy as np #创建数组(给array函数传递Python序列对象) a = np.array([1,2,3,4,5]) b = np.array((1,2,3,4,5,6)) ...
- logstash配置文件
1. 安装 logstash 安装过程很简单,直接参照官方文档: https://www.elastic.co/guide/en/logstash/current/installing-logsta ...
- java类的设计原则
1.内聚性 类应该描述一个单一的实体,所有的类操作应该在逻辑上相互配合,支持一个连贯性的目标.例如:学生和教职工属于不同的实体,应该定义两个类. 2.一致性 要遵循一定的设计风格和命名习惯.给类.方法 ...
- csu oj 1342: Double
Description 有一个由M个整数组成的序列,每次从中随机取一个数(序列中每个数被选到的概率是相等的)累加,一共取N次,最后结果能被3整除的概率是多少? Input 输入包含多组数据. ...
- Hadoop---日志服务器
Hadoop---日志服务器 1.历史服务器: 启动: 1)测试使用: 1.做一个任务: 2.接受任务: 3.执行任务: 4.执行任务完成: 2)日志文件产生: 成功后: 失败后: 点击进入His ...