【CF712E】Memory and Casinos(数学 期望 DP)
大意
给出一个序列,当你在某个点时,有一个向右走的概率\(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\)间反复横跳的情况。
我们不妨枚举一下它横跳的次数来计算
\]
化简为$$\frac{1}{1-S1.ValR\times (1-S2.ValL)}$$
即$$ValL=\frac{S1.ValL\times S2.ValL}{1-S1.ValR\times (1-S2.ValL)}$$
同理,对于\(ValR\),也有横跳的情况,但向左向右横跳的次数就有差距了。
\]
化简为$$\frac{(1-S2.ValR)\times S2.ValL\times S1.ValR}{1-S1.ValR\times (1-S2.ValL)}$$
同时,\(ValR\)也有不横跳的情况,即\(S2.ValR\).
综合一下
\]
对于ValL与ValR,可以使用线段树维护。
代码
没打重载,暴力合并
#include<cstdio>
#include<algorithm>
using namespace std;
#define fi first
#define se second
const double ONE=1.0;
const int MAXN=100005;
const int INF=0X3F3F3F3F;
int N,Q;
double P[MAXN];
struct Node{
int l,r;pair<double,double>val;
}s[MAXN*8];
void Push_Up(int rt){
pair<double,double>ret1=s[rt*2].val,ret2=s[rt*2+1].val;
s[rt].val.fi=ret1.fi*ret2.fi/(1-ret1.se*(1-ret2.fi));
s[rt].val.se=ret2.se+(1-ret2.se)*ret2.fi*ret1.se/(1-ret1.se*(1-ret2.fi));
}
void Build(int rt,int l,int r){
s[rt].l=l;s[rt].r=r;
s[rt].val.fi=s[rt].val.se=-INF;
if(l==r){
s[rt].val.fi=P[l];
s[rt].val.se=P[l];
return ;
}
int mid=(l+r)/2;
Build(rt*2,l,mid);
Build(rt*2+1,mid+1,r);
Push_Up(rt);
}
void Insert(int rt,int p,double val){
if(s[rt].l>p||s[rt].r<p)return ;
if(s[rt].l==s[rt].r){s[rt].val.fi=s[rt].val.se=val;return ;}
Insert(rt*2,p,val);Insert(rt*2+1,p,val);Push_Up(rt);
}
pair<double,double>Query(int rt,int l,int r){
pair<double,double>ret;ret.fi=ret.se=-INF;
if(s[rt].l>r||s[rt].r<l)return ret;
if(s[rt].l>=l&&s[rt].r<=r)return s[rt].val;
pair<double,double>ret1,ret2;
ret1=Query(rt*2,l,r);
ret2=Query(rt*2+1,l,r);
if(ret1.fi==-INF&&ret2.fi==-INF)return ret;
if(ret1.fi==-INF)ret=ret2;
else if(ret2.fi==-INF)ret=ret1;
else{
ret.fi=ret1.fi*ret2.fi/(1-ret1.se*(1-ret2.fi));
ret.se=ret2.se+(1-ret2.se)*ret2.fi*ret1.se/(1-ret1.se*(1-ret2.fi));
}
return ret;
}
int main(){
scanf("%d%d",&N,&Q);
for(int i=1,A,B;i<=N;i++){
scanf("%d%d",&A,&B);
P[i]=ONE*A/B;
}
Build(1,1,N);
for(int i=1,k,x,y,z;i<=Q;i++){
scanf("%d%d%d",&k,&x,&y);
if(k==1){
scanf("%d",&z);
Insert(1,x,ONE*y/z);
}
if(k==2)printf("%.10f\n",Query(1,x,y).fi);
}
return 0;
}
【CF712E】Memory and Casinos(数学 期望 DP)的更多相关文章
- codeforces1097D Makoto and a Blackboard 数学+期望dp
题目传送门 题目大意: 给出一个n和k,每次操作可以把n等概率的变成自己的某一个因数,(6可以变成1,2,3,6,并且概率相等),问经过k次操作后,期望是多少? 思路:数学和期望dp 好题好题!! ...
- lightoj1038(数学期望dp)
题意:输入一个数N,N每次被它的任意一个因数所除 变成新的N 这样一直除下去 直到 N变为1 求变成1所期望的次数 解析: d[i] 代表从i除到1的期望步数:那么假设i一共有c个因子(包括1和本身) ...
- 【BZOJ4872】[Shoi2017]分手是祝愿 数学+期望DP
[BZOJ4872][Shoi2017]分手是祝愿 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n ...
- BZOJ 1426: 收集邮票 数学期望 + DP
Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且 买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡 ...
- CF712E Memory and Casinos 期望概率
题意:\(n\)个赌场,每个赌场有\(p_{i}\)的胜率,如果赢了就走到下一个赌场,输了就退回上一个赌场,规定\(1\)号赌场的上一个是\(0\)号赌场,\(n\)号赌场的下一个是\(n + 1\) ...
- CF708E-Student‘s Camp【数学期望,dp】
正题 题目链接:https://www.luogu.com.cn/problem/CF708E 题目大意 有\(n*m\)的矩形网格,然后每次每行最左边和最右边的格子各有\(p=\frac{c}{d} ...
- Codeforces Round #370 (Div. 2) E. Memory and Casinos (数学&&概率&&线段树)
题目链接: http://codeforces.com/contest/712/problem/E 题目大意: 一条直线上有n格,在第i格有pi的可能性向右走一格,1-pi的可能性向左走一格,有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 ...
- [题解]数学期望_luogu_P1850_换教室
数学期望dp,题面第一次见很吓人,然而从CCF语翻译成人话就简单多了, 开始一般会想到用 f [ i ] [ j ]表示前 i 个课程申请 j 次的期望,然而其实会发现转移的时候还和上一次的情况有关( ...
随机推荐
- 分享一个自研开发的QA自动化审计工具-Sonar检查
评价一个系统或软件的质量高低,我始终认为除了需求和设计外,代码质量很重要,一个高质量的系统或软件,并不是被测试出来的,更多的是要靠设计和开发出来的.目前也有很多自动化的测试工具,更多的是从功能和性能角 ...
- Mysql 性能优化记录
记录工作中有关mysql性能优化的心得和经验 1. where条件中的字段 尽量建立索引 2. where条件中的查询条件等号左边尽量不做处理 如查询日期相关字段,尽量不使用date_fromat 或 ...
- powershell基础知识
基本命令 我们先从最基本的命令入手,Windows Powershell命令中get类命令是很庞大的一个命令工具集合,而且get类命令也是Powershell中占比最大的. 1.Get-Alias G ...
- 树莓派和荔枝派,局域网socket 通信
在虚拟机上面实现了socket 之间的通信之后,突发奇想,想要实现树莓派和 荔枝派zero之间的通信. 1.直接将虚拟机下面的程序复制过来,重新编译并且运行.发现是没有办法进行通信的.客户端一直报错: ...
- 《剑指offer》面试题10- I. 斐波那契数列
问题描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - ...
- 《剑指offer》面试题33. 二叉搜索树的后序遍历序列
问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜索树: 5 / \ ...
- SQL查询中关键字的执行顺序
SQL语句中的每个关键字都按照顺序往下执行,而每一步操作会生成一个临时表,最后的临时表就是最终结果: FROM <left_table>:from子句返回初始结果集 <join_ty ...
- lua之自索引
Father={ a=100, b=200 } function Father:dis() print(self.a,self.b) end Father.__index=Father Son= { ...
- Mac系统U盘制作教程
您可以将外置驱动器或备用宗卷用作安装 Mac 操作系统的启动磁盘. 以下高级步骤主要适用于系统管理员以及熟悉命令行的其他人员.升级 macOS 或重新安装 macOS 不需要可引导安装器,但如果您要在 ...
- LNMP架构搭建
目录 一:LNMP架构简介 1.Nginx与uwsgi 二:django框架+python 1.创建用户 2.安装依赖包 3.安装uwsgi和django 4.测试python 5.创建django项 ...