Codeforces712E
传送门 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的更多相关文章
随机推荐
- 【css技能提升】完美的 Sticky Footer 布局
在总结之前所做的项目时,遇到过下面这种情况. 在主体内容不足够多或者未完全加载出来之前,就会导致出现左边的这种情况,原因是因为没有足够的垂直空间使得页脚推到浏览器窗口最底部.但是,我们期望的效果是页脚 ...
- java锁——wait,notify,synchronized
背景:这篇博客用来总结java锁相关的知识点,平时还是要自己多加练习 wait 和 notify以及notifyAll (1).方法介绍1.wait.notify以及notifyAll都是Object ...
- SourceInsight快捷键
下载安装与设置 https://blog.csdn.net/k346k346/article/details/77412413 常用设置总结的还是比较全面的 问题: SourceInsight4.0中 ...
- 编写一个数组工具类, 编写本软件的 帮助文档(API文档)
本文档是对静态成员的练习. 一. 建立一个ArrayTool(数组工具)的类,在此类中对传入数组进行一些操作(选最大值.先最小值.冒泡排正序.选择排反序.输出数组元素), 二. 建立一个Test的类, ...
- Linux 中用 dd 命令来测试硬盘读写速度
dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. dd 命令通用语法格式如下: dd if=path/to/input_file ...
- aspcms逻辑错误导致后台地址泄露
访问即可跳转后台地址: URL:http://www.xxx.org.cn/plug/oem/AspCms_OEMFun.asp 注入:plug/comment/commentList.asp?id= ...
- MySQL的复制机制
MySQL的复制机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL复制介绍 1>.MySQL复制允许将主实例(master)上的数据同步到一个或多个从实例( ...
- hibernate HQL查询参数设置
Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定: Prepa ...
- Sublime Text3中 less 自动编译成 css 的方法
使用sublime text的less2css插件 步骤: 1.安装node.js,这个到官网下载即可 2.安装less,方法:命令行输入: npm install -g less 3.sublime ...
- .net多站点通过StateServer实现session共享
先在所有要共享站点web.config的<system.web>结点下加 <!--session的mode=StateServer--><sessionState coo ...