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的更多相关文章
随机推荐
- 跟我一起用node-express搭建一个小项目(node连接mongodb)[三]
数据库虽然安装并启动成功了,但我们需要连接数据库后才能使用数据库. 怎么才能在 Node.js 中使用 MongoDB 呢? 我们使用官方提供的 node-mongodb-native 驱动模块,打开 ...
- 第九节、人脸检测之Haar分类器
人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方向发展起来. 目前人脸检测的方法主 ...
- Codeforces Round #529 (Div. 3) F.Make It Connected
传送门 题意: 有 n 个顶点,每个顶点有个花费 a[ i ],连接顶点 u,v 需要花费 a[v]+a[u]的代价. 有 m 个特殊边,每条边有三个参数 u,v,w 代表的意思是连接 u,v 的花费 ...
- 安装Androidsdudio时
安装Androidsdudio时,Androidsdudio的路劲可以任意选择,但Androidsdk的路劲就默认到c盘里.然后安装后就可以直接用了
- java List集合
List集合包括四种类,分别是ArrayList.LinkedList.Vector.Stack. ArrayList:元素的存储是顺序存储,可以根据数组的下标查询,查询速度快,但是在删除和插入元素时 ...
- Mac上在终端上解压与压缩
1.安装rar 1.brew install unrar 2.unrar -version 3.进入需要解压的文件目录下,unrar x 文件夹名.rar 1.tar -xvf [file.tar.g ...
- php 在服务器端开启错误日志记录方法
修改php.ini设置,或者通过方法 ini_set设置以下项即可 1.打开error_reporting设置: 如 error_reporting= E_ALL 2. log_errors=On ...
- 这3周以来的面试总结(C#/.net 智能硬件/物联网)
2017.3找工作面试记录-第一周 2017.3找工作面试记录-第一周(2) 2017.3找工作面试记录-第二周 2017.4找工作面试记录-第三周 2017.4找工作面试记录-第三周(2)--金蝶 ...
- JAVA核心技术I---JAVA基础知识(文本文件读写)
一:java IO包概述 (一)Java读写文件,只能以(数据)流的形式进行读写 (二)java IO 包 –节点类:直接对文件进行读写 –包装类 • 转化类:字节/字符/数据类型的转化类 • 装饰类 ...
- CM记录-部署cdh5.3.3集群
1.安装操作系统,保证联网环境,本文以CentOS 6.8为操作系统(略) 2.wget下载安装包(以5.3.3为例) #mkdir /usr/cdh ---新建cm安装目录 #cd /usr/cdh ...