传送门 here

题意:

有n个赌场,第i个赌场的胜率为$ P_i$,在第i个赌场若取胜则到达第$ i+1$个赌场,反之到达第$ i-1$个赌场

定义统治赌场$ L...R$为从赌场$ L$开始,从赌场$ R+1$结束且期间没有到达过$ L$前面的赌场(没有在赌场$ L$输过)

有$ q$次操作,修改一个赌场的胜率或者询问统治赌场$ L...R$的概率

这题真的很妙啊...

我们定义$ f(i)$为从i走到目标地点的概率

显然当询问$ L...R$时有$ f(L-1)=0,f(R+1)=1$

根据题意有$ f(i)=P_if(i+1)+(1-P_i)f(i-1)$

移项得$ f(i)-f(i-1)=P_if(i+1)+(1-1-P_i)f(i-1)=P_i(f(i+1)-f(i-1))$

定义$ g(i)=f(i)-f(i-1)$

则有$ g(i)=P_i(f(i+1)-f(i-1))$

容易发现$ g(L)=f(L)$也就是所要求的答案

计算$ g(i+1)+g(i)=f(i+1)-f(i)+f(i)-f(i-1)=f(i+1)-f(i-1)=\frac{1}{P_i}g(i)$

因而有$ g(i+1)=\frac{1-P_i}{P_i}g(i)$

根据g的定义有$ \sum\limits_{i=L}^Rg(i)=f(R+1)-f(L-1)=1$

我们又知道$ g(i+1)$和$ g(i)$的比值关系,设为$ t_i$

则有$ g(L)*(1+t_L+t_Lt_{L+1}+...+t_{L}*...*t_{R})=1$

就可以用线段树维护t的信息计算结果了

由于只需要四位精度,因此当括号内的数超过$ 10000$即可跳出避免爆double

my code:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rt register int
#define ll long long
#define r read()
using namespace std;
ll read()
{
ll x = ; int zf = ; char ch;
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
}
int i,j,k,m,n,x,y,z,cnt,all,num;
double p[],val[],qz[];
struct segment_tree{
int L,R;double val,ji;
}a[];
void build(const int x,const int L,const int R)
{
a[x].L=L;a[x].R=R;
if(L==R)
{
a[x].val=a[x].ji=val[L];
return;
}
const int mid=L+R>>;
build(x<<,L,mid);build(x<<|,mid+,R);
a[x].val=a[x<<].val+a[x<<|].val*a[x<<].ji;
a[x].ji=a[x<<].ji*a[x<<|].ji;
}
void change(const int x,const int L,const double val)
{
if(a[x].L==a[x].R)
{
a[x].val=a[x].ji=val;
return;
}
L<=a[x].L+a[x].R>>?change(x<<,L,val):change(x<<|,L,val);
a[x].val=a[x<<].val+a[x<<|].val*a[x<<].ji;
a[x].ji=a[x<<].ji*a[x<<|].ji;
}
double ansa,ansb;
void query(const int x,const int L,const int R)
{
if(ansa>)return;
if(a[x].L>R||a[x].R<L)return;
if(a[x].L>=L&&a[x].R<=R)
{
ansa+=a[x].val*ansb;
ansb*=a[x].ji;
return;
}
query(x<<,L,R);query(x<<|,L,R);
}
int main()
{
n=r;m=r;
for(rt i=;i<=n;i++)
{
x=r;y=r;
p[i]=(double)x/(double)y;
val[i]=(-p[i])/p[i];
}
build(,,n);
while(m--)
{
int opt=r;
if(opt==)
{
int L=r,R=r;ansa=;ansb=;query(,L,R);
printf("%.6f\n",/(ansa+));
}
else
{
int L=r;x=r;y=r;
double t=(double)x/(double)y;
change(,L,(-t)/t);
p[L]=t;
}
}
return ;
}

Codeforces712E的更多相关文章

随机推荐

  1. 认识Jmeter工具

    1.Apache jmeter 是一个100%的纯java桌面应用,是Apache组织开发的基于java的压力测试工具.它最初被设计用于Web应用测试但后来扩展到其他测试领域,可以用于对静态的和动态的 ...

  2. SSH框架调用scrapy爬虫

    毕设刚答辩完毕,不用担心查重了,所以补一篇毕设的内容. 毕设是图片搜索网站,使用python爬虫获取图片资源,再由javaweb管理使用图片的信息和图片,大部分实现起来十分简单,也不好意思炫耀.但是有 ...

  3. 快速入门Treap(代码实现)

    学习数据结构对我来说真的相当困难,网上讲\(Treap\)的我也看不太懂,前前后后花了大概六天才把\(Treap\)学会.为了避免再次忘记,这里我整理一下\(Treap\)的基础知识和模板. 阅读此文 ...

  4. linux服务器,发现大量TIME_WAIT

    linux服务器,发现大量TIME_WAIT 今天登陆linux服务器,发现大量TIME_WAIT参考资料:http://coolnull.com/3605.html 酷喃|coolnull| » 大 ...

  5. 编写Excel文件的Golang库

    github:https://github.com/360EntSecGroup-Skylar/excelize 使用用例 https://dev.to/xuri/go-library-for-rea ...

  6. 2017-12-15python全栈9期第二天第七节之x or y ,x 为 非 0时,则返回x

    #!/user/bin/python# -*- coding:utf-8 -*-# x or y ,x 为 非 0时,则返回xprint(1 or 2)print(3 or 2)print(0 or ...

  7. CatBoost算法和调参

    欢迎关注博主主页,学习python视频资源 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?co ...

  8. 实战Google深度学习框架-C5-MNIST数字识别问题

    5.1 MNIST数据处理 MNIST是NIST数据集的一个子集,包含60000张图片作为训练数据,10000张作为测试数据,其中每张图片代表0~9中的一个数字,图片大小为28*28(可以用一个28* ...

  9. MySQL语句_积累

    1.GROUP_CONCAT 直接返回拼接好的多个结果,可以供IN()函数使用 语句 结果 +-----------------------------------------+ | GROUP_CO ...

  10. ESXI6时间源快速同步

    1.使用SSH会话连接到ESXi主机. 2./etc/ntp.conf 在文本编辑器中打开 添加内天tos maxdist 303.运行此命令以访问 likewise shell /usr/lib/v ...