CF712E Memory and Casinos 期望概率
题意:\(n\)个赌场,每个赌场有\(p_{i}\)的胜率,如果赢了就走到下一个赌场,输了就退回上一个赌场,规定\(1\)号赌场的上一个是\(0\)号赌场,\(n\)号赌场的下一个是\(n + 1\)号赌场,一旦到达\(0\)或\(n + 1\)号赌场就相当于退出赌局了。
定义统治区间\([l, r]\)为从第\(l\)个赌场开始,到达第\(r + 1\)个赌场,且在过程中不经过\([1, l - 1]\)的赌场。维护2种操作:
1,修改一个赌场的胜率
2,询问统治\([l, r]\)的概率
题解:
设\(f_{i}\)表示从\(x\)能走到\(n\)的概率,则有:
\]
\]
令\(g_{i} = f_{i} - f_{i - 1} = p_{i} (g_{i} + g_{i + 1})\)(由上式得)
所以\(g_{i + 1} = g_{i} \cdot \frac{1 - p_{i}}{p_{i}}\),
令\(t_{i} = \frac{1 - p_{i}}{p_{i}}\),则\(g_{i + 1} = g_{i} t_{i}\)
显然有\(f_{n} = 1(不用走就到了), f_{0} = 0(因为已经出边界)\).
所以\(\sum_{i = 1}^{n}g_{i} = 1\),那么带入上面\(g_{i + 1} = g_{i} t_{i}\),得到:
\]
提出\(g_{1}\).
\]
那么我们维护\(t\)值,就可以得到\(g_{1}\)的值。
上面是求询问区间\([1, n - 1]\)时的答案,也就是\(1\)到\(n\)的概率。
替换一下,同理可得,在询问区间\([l, r]\)时,也就是要求\(l\)到\(r + 1\)的概率,那么就有如下等式:
\]
用线段树维护:
对于区间\([l, r]\)维护\(t_{l} + t_{l}t_{l + 1} + ... + t_{l}t_{l + 1}...t_{r}\).然后在最后加1即可。
定义node结构体,其中x表示这个区间的\(t_{l} + t_{l}t_{l + 1} + ... + t_{l}t_{l + 1}...t_{r}\),w表示\(t_{l}t_{l + 1}...t_{r}\)
那么合并时新区间的x为\(left.x + right.x * left.w\),
w为\(left.w \cdot right.w\)
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 101000
#define ac 500000
int n, q, w;
int l[ac], r[ac];
double ans, go;
double tree[ac], p[AC], t[AC], sum[ac];
struct node{
double x, w;
};
inline int read()
{
int x = 0;char c = getchar();
while(c > '9' || c < '0') c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x;
}
inline void update(int x){
int ll = x * 2, rr = ll + 1;
sum[x] = sum[ll] * sum[rr];
tree[x] = tree[ll] + tree[rr] * sum[ll];
}
void build(int x, int ll, int rr)
{
l[x] = ll, r[x] = rr;
if(ll == rr) {tree[x] = sum[x] = t[ll]; return ;}
int mid = (ll + rr) >> 1;
build(x * 2, ll, mid), build(x * 2 + 1, mid + 1, rr);
update(x);
}
void change(int x, int go, double w)
{
if(l[x] == r[x]){sum[x] = tree[x] = w; return ;}
int mid = (l[x] + r[x]) >> 1;
(go <= mid) ? change(x * 2, go, w) : change(x * 2 + 1, go, w);
update(x);
}
node find(int x, int ll, int rr)
{
if(l[x] == ll && r[x] == rr) return (node){tree[x], sum[x]};
int mid = (l[x] + r[x]) >> 1;
if(rr <= mid) return find(x * 2, ll, rr);
else if(ll > mid) return find(x * 2 + 1, ll, rr);
else
{
node now = find(x * 2, ll, mid), y = find(x * 2 + 1, mid + 1, rr);
now.x = now.x + y.x * now.w, now.w = now.w * y.w;//要更新now.w!!!
return now;
}
}
void pre()
{
n = read(), q = read();
for(R i = 1; i <= n; i ++)
{
double a = read(), b = read();
p[i] = a / b;
}
for(R i = 1; i <= n; i ++) t[i] = (1 - p[i]) / p[i];
}
void work()
{
int opt, a, b, x;
for(R i = 1; i <= q; i ++)
{
opt = read();
if(opt == 1)
{
x = read(), a = read(), b = read(), go = 1.0 * a / b;
go = (1 - go) / go, change(1, x, go);
}
else
{
a = read(), b = read();
node x = find(1, a, b);
// printf("%lf\n", x.x);
printf("%.10lf\n", 1 / (1 + x.x));
}
}
}
int main()
{
freopen("in.in", "r", stdin);
pre();
build(1, 1, n);
work();
fclose(stdin);
return 0;
}
CF712E Memory and Casinos 期望概率的更多相关文章
- 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 ...
- 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 ...
- HDU 3853 期望概率DP
期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] , 右移:[x][y ...
- 【BZOJ 3652】大新闻 数位dp+期望概率dp
并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的 ...
- 【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基
大力观察:I.从输出精准位数的约束来观察,一定会有猫腻,然后仔细想一想,就会发现输出的时候小数点后面不是.5就是没有 II.从最后答案小于2^63可以看出当k大于等于3的时候就可以直接搜索了 期望概率 ...
- 【BZOJ 3925】[Zjoi2015]地震后的幻想乡 期望概率dp+状态压缩+图论知识+组合数学
神™题........ 这道题的提示......(用本苣蒻并不会的积分积出来的)并没有 没有什么卵用 ,所以你发现没有那个东西并不会 不影响你做题 ,然后你就可以推断出来你要求的是我们最晚挑到第几大的 ...
- 【NOIP模拟赛】黑红树 期望概率dp
这是一道比较水的期望概率dp但是考场想歪了.......我们可以发现奇数一定是不能掉下来的,因为若奇数掉下来那么上一次偶数一定不会好好待着,那么我们考虑,一个点掉下来一定是有h/2-1个红(黑),h/ ...
- BZOJ2337: [HNOI2011]XOR和路径 期望概率dp 高斯
这个题让我认识到我以往对于图上期望概率的认识是不完整的,我之前只知道正着退还硬生生的AC做过的所有图,那么现在让我来说一下逆退,一般来说对于概率性的东西都只是正推,因为有了他爸爸才有了他,而对于期望性 ...
随机推荐
- Drupal views 学习之初识
1. 简介 用过Yii框架的同学,应该都会用到过GridView和ListView组件.可以很方便的用网格或列表展示内容. 例如淘宝: 网格显示 列表显示 2. 使用view可以方便的配出类似上面的展 ...
- 学习HTML 第一节.小试牛刀
此贴并非教学,主要是自学笔记,所述内容只是些许个人学习心得的记录和备查积累,难以保证观点正确,也不一定能坚持完成. 如不幸到访,可能耽误您的时间,也难及时回复,贴主先此致歉.如偶有所得,相逢有缘,幸甚 ...
- selenium自动化之处理浏览器警告弹窗
有的网站会弹出类似如下图的警告弹窗,你会发现这种弹窗在html源码中怎么也定位不到,接下来将介绍这种弹窗的处理方式. 其实这种弹窗是不属于html的元素的,他是属于浏览器自带的弹窗,所以用定位元素的方 ...
- 第四篇 Postman之Pre-request Script(前置处理器:JS之 YYYY-MM-DD HH:MM:SS)
本篇来讲讲Pre-request Script 前置处理器,定义在发送request之前需要运行的一些脚本,应用场景主要是设置全局变量和环境变量. 本例子也是项目中遇到的,需要修改与客户的预约时间,但 ...
- PytorchZerotoAll学习笔记(五)--逻辑回归
逻辑回归: 本章内容主要讲述简单的逻辑回归:这个可以归纳为二分类的问题. 逻辑,非假即真.两种可能,我们可以联想一下在继电器控制的电信号(0 or 1) 举个栗子:比如说你花了好几个星期复习的考试(通 ...
- 【Pthon入门学习】多级菜单小例子
menu_list = { '北京':{ '昌平':{ '回龙观':{ '和谐家园':{}, '矩阵小区':{}, '北店家园':{} }, '沙河':{ '北街家园1区':{}, '北街家园2区': ...
- Android 7.1.1 又出幺蛾子了 —— 再谈 Android 上的 Wifi 连接
在之前的博客文章中,我写了点在 Android 6 系统中连接到指定名称的 Wifi 的体验.然而,在 Android 7 中,有一些东西又变化了.另外就是在那篇文章中我说要提供代码,结果拖到这篇文章 ...
- 人生苦短,我用Python!
一.程序分析 1.读取文件到缓冲区 def process_file(): # 读文件到缓冲区 try: # 打开文件 f = open("C:\\Users\\panbo\\Desktop ...
- s2sh乱码一个小处理(新手按流程走)
解决乱码几小点: 1.配置过滤器,可以选择自己写,既然你用的SSH框架就更简单了,直接用Spring的过滤器,web.xml里配置一下即可. 2.Jsp页面设置编码,所有地方都要相同,我习惯用GBK ...
- 博弈---威佐夫博奕(Wythoff Game)
这个写的不错 威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同 时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 这种情况下是颇为复杂 ...