CF712E Memory and Casinos

Link
设\(f(l,r)\)为从\(l\)走到\(r+1\)并且在\(l,r\)没有输过的概率,\(g(l,r)\)为从\(r\)走到\(l-1\)并且在\(l,r\)没有赢过的概率。
那么这题看上去就很线段树了对吧。
首先很显然\(f(i,i)=p_i,g(i,i)=1-p_i\)。
然后考虑合并\([l,mid],(mid,r]\)的答案。
枚举跨过\((mid,mid+1)\)这一分界线然后又走回来的次数,可以得到\(f(l,r)=f(l,mid)f(mid+1,r)\sum\limits_i((1-f(mid+1,r))(1-g(l,mid)))^i\)。
显然这个幂级数收敛,所以\(f(l,r)=\frac{f(l,mid)f(mid+1,r)}{1-(1-f(mid+1,r))(1-g(l,mid))}\)。
同理可得\(g(l,r)=\frac{g(l,mid)g(mid+1,r)}{1-(1-f(mid+1,r))(1-g(l,mid))}\)。
然后线段树随便维护一下就完事了。

#include<cstdio>
#include<cctype>
namespace IO
{
    char ibuf[(1<<21)+1],*iS,*iT;
    char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}
    int read(){int x=0,c=Get();while(!isdigit(c))c=Get();while(isdigit(c))x=x*10+c-48,c=Get();return x;}
}using IO::read;
using db=double;
const int N=100007;
struct node{db f,g;}t[N<<2];db p[N];
node operator+(const node&a,const node&b){return {a.f*b.f/(1-(1-b.f)*(1-a.g)),a.g*b.g/(1-(1-b.f)*(1-a.g))};}
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
void pushup(int p){t[p]=t[ls]+t[rs];}
void modify(int p,db v){t[p]={v,1-v};}
void build(int p,int l,int r)
{
    if(l==r) return modify(p,1.0*read()/read());
    build(ls,l,mid),build(rs,mid+1,r),pushup(p);
}
void update(int p,int l,int r,int x)
{
    if(l==r) return modify(p,1.0*read()/read());
    (x<=mid? update(ls,l,mid,x):update(rs,mid+1,r,x)),pushup(p);
}
node query(int p,int l,int r,int L,int R)
{
    if(L<=l&&r<=R) return t[p];
    if(r<L||R<l) return {1,1};
    return query(ls,l,mid,L,R)+query(rs,mid+1,r,L,R);
}
int main()
{
    int n=read(),q=read();
    build(1,1,n);
    for(int x;q;--q) read()==1? update(1,1,n,read()):(x=read(),printf("%.6lf\n",query(1,1,n,x,read()).f),void());
}

原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12234697.html

时间: 2024-10-30 12:27:18

CF712E Memory and Casinos的相关文章

cf 712E Memory and Casinos

题意:有一行$n(n \leq 100000)$个方格,从左往右第$i$个方格的值为$p_i(p_i = \frac{a}{b}, 1 \leq a < b \leq 1e9)$,有两种操作,一种是将某个方格的值更新为另一个分数表示的有理数,另一种操作是寻味区间$[l, r](l \leq r)$的权值$w(l, r)$:$w(l, r)$如下定义: 方格在位置$i$有$p_i$的概率向右移动一格,有$1-p_i$的概率向左移动一格.$w(l, r)$表示方格初始位置在$l$并且以在位置$r$向

cpdeforces 712 E. Memory and Casinos 概率论 + 线段树

给出一个数组p,长度为n,1  <= n  <= 10^5 表示有n个格子,在第i个格子,你有p[i]的概率会到i + 1,有1 - p[i]的概率会到i - 1 如果在区间[l,r]上玩游戏,我们规定你起点在l,然后你开始走, 如果你到了l - 1,那么你失败了,游戏结束 如果你到了r + 1,那么你成功了,游戏结束 现在有q个操作,1 <= q <= 10^5 1 i a b   修改p[i] = (double)a / b 2 l r      询问在[l,r]上玩游戏,成功

Linux 性能监控 : CPU 、Memory 、 IO 、Network

一.CPU 1.良好状态指标 CPU利用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70% 上下文切换:与CPU利用率相关联,如果CPU利用率状态良好,大量的上下文切换也是可以接受的 可运行队列:每个处理器的可运行队列<=3个线程 2.监控工具 vmstat $ vmstat 1 procs -----------memory---------- ---swap-- -----io---- --s

Java系列: 如何在Eclipse中安装Memory Analyzer插件

一.找到eclipse的插件安装对话框: help->install new software ->work with 二.输入Memory Analyzer的安装路径 具体可以到http://www.eclipse.org/mat/downloads.php 去找 我安装的时候的版本是1.6.1,如下 三.开始安装     null

dirty memory

关于各种内存的解释,来源于stackoverflow Wired : This refers to kernel code and such. Memory that should not   ever be moved out of the RAM. Also know as resident memory. Shared : Memory that is shared between two or more processes. Both   processes would show thi

CSharp - Memory leaks problem detection and solution

/* By Dylan SUN*/ Out of memory exception happens when server doesn't have enough memory to run the application. This often happens when you are dealing with external resources, such as consuming Interop libraries, treating files, streams, etc. Memor

There is insufficient memory for the Java Runtime Environment to continue问题解决

在linux系统下长时间进行性能测试,连续几次发生服务器假死无法连接上的情况,无奈只能重启服务器.在测试路径下发现hs_err_pid17285.log文件,打开文件查看其主要内容如下: # There is insufficient memory for the Java Runtime Environment to continue.# Cannot create GC thread. Out of system resources.# Possible reasons:#   The sy

内存泄露 Memory Leaks 内存优化【总结】

什么是内存泄露 内存管理一直是Java 所鼓吹的强大优点.开发者只需要简单地创建对象,而Java的垃圾收集器将会自动管理内存空间的分配和释放. 但在很多情况下,事情并不那么简单,在 Java程序中总是会频繁地发生内存泄露(Memory Leaks). 内存泄漏就是:当某些对象不再被应用程序所使用,但是由于仍然被引用而导致垃圾收集器不能释放他们. 或者说是:我们对某一内存空间使用完成后没有释放. 用白话来说就是:该回收的内存没被回收. 要理解这个定义,我们需要理解内存中的对象状态.下图展示了什么是

[SQL] - Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 问题之解决

场景: 使用 Oracle.DataAccess.dll 访问数据库时,OracleDataAdapter 执行失败. 异常: System.AccessViolationException was unhandled  HResult=-2147467261  Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.  Source