【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 次的期望,然而其实会发现转移的时候还和上一次的情况有关( ...
随机推荐
- DB2给表批量赋权
使用DB2的for循环语句给表批量赋权,同理,稍加修改可作为其他批量操作. 值得注意的是: grant语句无法直接执行,需要使用execute immediate才能执行. 授权操作表的所有权限:gr ...
- 初识python: 局部变量、全局变量
定义: 全局变量:在函数一开始定义的变量(全局范围内都可以使用) 局部变量:在函数中定义的变量(只能在函数中使用) 局部变量,例: #局部变量 def chang_name(name): print( ...
- mysql数据库忘记root密码怎么办?
mysql数据库忘记root密码怎么破解和修改 1.停止数据库的运行 [root@localhost ~]# /etc/init.d/mysqld stop 或者[root@localhost ~]# ...
- centos7 修改网卡信息
修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-eth0 有一些不是eth0 也可能是ens33 修改完成后使用下面命令进行重启 systemctl ...
- 使用.NET 6开发TodoList应用(23)——实现请求限流
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 Rate Limiting允许保护我们的API服务免受过多请求的连接导致的性能下降,如果请求次数超过了限制,API服务端将会拒 ...
- Java中生成一个唯一值的方式
现总结几种生成一个唯一值的方式 第一种:采用nanoTime() // 理论上存在重复的可能,可以在后面再加上一个随机字符串 Random r = new Random(); for (int i = ...
- 用js判断页面是否加载完成实现代码
方式一:window.onload: 当一个文档完全下载到浏览器中时,才会触发window.onload事件.这意味着页面上的全部元素对js而言都是可以操作的,也就是说页面上的所有元素加载完毕才会执行 ...
- vue文档1-VSCode介绍
开发工具VSCode: Vue的开发工具用的是VSCode(Visual Studio Code),这款开发工具是微软官方出品,开源,免费,并且功能相当强大,使用者很多,插件相当丰富,是Vue开发的不 ...
- selenium - 弹出框死活定位不到
先要确定是不是alert,是才能用,不是的话肯定不能用. 有些弹出框是div层,这种跟平常定位方法一样 有些弹出框是嵌套的iframe层,这种切换iframe就可以了 有些弹出框比较坑,是嵌入的一个窗 ...
- 推荐一个github国内访问加速神器GitHub520
一.介绍 对 GitHub 说"爱"太难了:访问慢.图片加载不出来. 注: 本项目还处于测试阶段,仅在本机测试通过,如有问题欢迎提 issues 本项目无需安装任何程序,通过修改本 ...