codeforces 712E
2016-09-12 22:48
323 查看
题目大意
有n个赌场,你在i赌场时,有pi的概率走到i+1,有1−pi的概率走到i−1.保证任何时候pi≤pi+1有q次操作,修改一个赌场的p值;或者询问[l,r]表示从第l个赌场走到r的概率,他在走的过程中不会离开区间[l,r].
解题思路
设fi表示从i能走到n的概率。易得fi=fi−1∗(1−pi)+fi+1∗pi⇒fi−fi−1=pi∗(fi+1−fi−1).
令gi=fi−fi−1
得gi=pi∗(gi+gi+1)⇒gi+1=gi∗1−pipi
令ti=1−pipi
则gi+1=gi∗ti
易得∑ni=1gi=1且f1=g1.
∴g1+g1∗t1+g1∗t1∗t2+……+g1∗t1∗t1∗t2∗t3∗……∗tn−1=1
g1∗(1+t1+t1∗t2+……+t1∗t1∗t2∗t3∗……∗tn−1)=1
只需维护
(1+t1+t1∗t2+……+t1∗t1∗t2∗t3∗……∗tn−1)
即可。
这个可以使用线段树简单实现。
参考代码
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) #define maxn 100005 #define db double using namespace std; struct seg{ db a,b; }t[maxn * 4],now; int n,q; db p[maxn]; void build(int v,int l,int r){ if (l==r) { t[v].a=t[v].b=(1-p[l])/p[l]; return; } int mid=(l+r) >> 1; build(v << 1,l,mid); build(v << 1 | 1,mid+1,r); t[v].a=t[v << 1].a*t[v << 1 | 1].a; t[v].b=t[v << 1].b+t[v << 1 | 1].b*t[v << 1].a; } void change(int v,int l,int r,int x){ if (l==r) { t[v].a=t[v].b=(1-p[l])/p[l]; return; } int mid=(l+r) >> 1; if (x<=mid) change(v << 1,l,mid,x); else change(v << 1 | 1,mid+1,r,x); t[v].a=t[v << 1].a*t[v << 1 | 1].a; t[v].b=t[v << 1].b+t[v << 1 | 1].b*t[v << 1].a; } void query(int v,int l,int r,int x,int y){ if (l==x && r==y) { now.b=now.b+now.a*t[v].b; now.a=now.a*t[v].a; return; } int mid=(l+r) >> 1; if (y<=mid) query(v << 1,l,mid,x,y); else if (x>mid) query(v << 1 | 1,mid+1,r,x,y); else query(v << 1,l,mid,x,mid),query(v << 1 | 1,mid+1,r,mid+1,y); } int main(){ scanf("%d%d",&n,&q); fo(i,1,n) { int x,y; scanf("%d%d",&x,&y); p[i]=1.0* x / y; } build(1,1,n); while (q--) { int Type,x,y,z; scanf("%d",&Type); if (Type==1) { scanf("%d%d%d",&x,&y,&z); p[x]=1.0 * y / z; change(1,1,n,x); } else { scanf("%d%d",&x,&y); db ans; now.a=1; now.b=0; query(1,1,n,x,y); if (now.b<=1e15) ans=1/(1+now.b); else ans=0; printf("%.10lf\n",ans); } } return 0; }
相关文章推荐
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- Codeforces Educational Codeforces Round 16 部分题解
- 【WHUST 2016 Individual Contest #1】解题报告
- 【WHUST 2016 Individual Contest #2】解题报告
- 【WHUST 2016 Individual Contest #3 】解题报告
- CodeForces 449A - Jzzhu and Chocolate
- CodeForces 449 B. Jzzhu and Cities
- codeforces 618C. Constellation
- Codeforces Round #349 (Div. 2) - C
- Codeforces Round #361 (Div. 2)
- 7.13Codeforces Round #360 (Div. 2)
- Codeforces Round #363 (Div. 2)
- Codeforces Round #265 (Div. 2)
- A.Bus to Udayland
- codeforces 1B Spreadsheets
- Codeforces #310 div2 C. Case of Matryoshkas
- Codeforces Round #364 vp