题目

小\(R\)和小\(B\)一共完了\(n\)局游戏,第一局小\(R\)获胜的概率为\(p_i\),没有平局,对于第$ i $局游戏:

  1. 如果第\(i-1\)局游戏小$ R \(获胜,那么第 局游戏小\) R $获胜的概率为 \(p_i\),小$ B $获胜的概率为 \(1-p_i\)
  2. 如果第\(i-1\)局游戏小\(B\)获胜,那么第 局游戏小$ R $获胜的概率为 \(q_i\),小$ B $获胜的概率为 \(1-q_i\)

有\(m\)次两种操作:

​ 1 \(add \ i \ c\) 加入第\(i\)局比赛的结果;

​ 2$del \ i \( 忘记第\)i$局比赛的结果;

输出每次比赛小\(R\)获胜局数的期望;

\(1 \le n,m \le 200000\)

题解

  • 根据期望的线性性考虑每一局获胜的概率,每一局获胜的概率只和相邻的两个确定的局面有关系;

    \[\begin{align}
    &bayes公式:\\
    P(A|B)P(B) &= P(A\ \cap B) \Leftrightarrow P(A|B) = \frac{P(B|A)P(A)}{P(B)} \\
    &P(x_i=1|x_l=a,x_r=b)(1\lt i \le r)\\
    &=\frac{P(x_i=1,x_l=a,x_r=b)}{P(x_l=a,x_r=b)}\\
    &=\frac{P(x_i=1,x_l=a,x_r=b)}{P(x_l=a)P(x_r=b|x_l=a)}\\
    &=\frac{P(x_i=1,x_r=b|x_l=a)}{P(x_r=b|x_l=a)}\\
    \end{align}
    \]

  • 把转移写成矩阵\(A_i\),注意到分母即\((\Pi_{i>l}^{r}A_i)_{a,b}\),是个定值

  • 分母求和即\((\sum_{i>l}^{r} \ \Pi_{j \gt l}^{j \lt i} A_j \times B_i \times \Pi_{j \gt i}^{j \lt r} A_j)_{a,b}\),即将\(A_i\)换成一个只允许转移到1的矩阵\(B_i\),可以用线段树维护

  • 插入和删除用\(set\)维护即可

    #include<bits/stdc++.h>
    #define ls (k<<1)
    #define rs (k<<1|1)
    #define ld double
    #define fi first
    #define se second
    #define ls (k<<1)
    #define rs (k<<1|1)
    using namespace std;
    const int N=200010;
    int n,m;
    char op[10];
    map<int,int>S;
    map<int,int>::iterator it,pre,nxt;
    ld p[N],q[N],ans;
    struct Mat{
    ld c[2][2];
    Mat operator +(const Mat&A)const{
    Mat re;
    for(int i=0;i<2;++i)
    for(int j=0;j<2;++j){
    re.c[i][j]=c[i][j]+A.c[i][j];
    }
    return re;
    }
    Mat operator *(const Mat&A)const{
    Mat re;
    for(int i=0;i<2;++i)
    for(int j=0;j<2;++j){
    re.c[i][j]=0;
    for(int k=0;k<2;++k)re.c[i][j]+=c[i][k]*A.c[k][j];
    }
    return re;
    }
    };
    struct data{Mat mul,sum;}tr[N<<2];
    data operator +(data A,data B){
    data re;
    re.mul=A.mul*B.mul;
    re.sum=A.mul*B.sum+A.sum*B.mul;
    return re;
    }
    void build(int k,int l,int r){
    if(l==r){
    tr[k].mul.c[1][1]=p[l];
    tr[k].mul.c[1][0]=1-p[l];
    tr[k].mul.c[0][1]=q[l];
    tr[k].mul.c[0][0]=1-q[l];
    tr[k].sum.c[1][1]=p[l];
    tr[k].sum.c[0][1]=q[l];
    return;
    }
    int mid=(l+r)>>1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    tr[k]=tr[ls]+tr[rs];
    }
    data query(int k,int l,int r,int x,int y){
    if(l==x&&r==y)return tr[k];
    int mid=(l+r)>>1;
    if(y<=mid)return query(ls,l,mid,x,y);
    else if(x>mid)return query(rs,mid+1,r,x,y);
    else return query(ls,l,mid,x,mid)+query(rs,mid+1,r,mid+1,y);
    }
    ld ask(int l,int r){
    data tmp=query(1,0,n+1,l+1,r);
    return tmp.sum.c[S[l]][S[r]]/tmp.mul.c[S[l]][S[r]];
    }
    int main(){
    // freopen("game.in","r",stdin);
    // freopen("game.out","w",stdout);
    scanf("%d%d%s%lf",&n,&m,op,&p[1]);
    for(int i=2;i<=n;++i)scanf("%lf%lf",&p[i],&q[i]);
    p[0]=q[0]=1;
    S[0]=1;S[n+1]=0;
    build(1,0,n+1);
    ans=ask(0,n+1);
    for(int i=1,x,y;i<=m;++i){
    scanf("%s%d",op,&x);
    if(op[0]=='a'){
    scanf("%d",&y);S[x]=y;
    it=S.lower_bound(x);
    pre=it,--pre;nxt=it,++nxt;
    ans-=ask((*pre).fi,(*nxt).fi);
    ans+=ask((*pre).fi,(*it).fi);
    ans+=ask((*it).fi,(*nxt).fi);
    }else{
    it=S.lower_bound(x);
    pre=it,--pre;nxt=it,++nxt;
    ans-=ask((*pre).fi,(*it).fi);
    ans-=ask((*it).fi,(*nxt).fi);
    ans+=ask((*pre).fi,(*nxt).fi);
    S.erase(it);
    }
    printf("%.10lf\n",ans);
    }
    return 0;
    }

【loj2263】【CTSC2017】游戏的更多相关文章

  1. [CTSC2017]游戏(Bayes定理,线段树)

    传送门:http://uoj.ac/problem/299 题目良心给了Bayes定理,但对于我这种数学渣来说并没有什么用. 先大概讲下相关数学内容: 1.定义:$P(X)$ 表示事件$X$发生的概率 ...

  2. PKUSC2018训练日程(4.18~5.30)

    (总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...

  3. UOJ#299. 【CTSC2017】游戏 线段树 概率期望 矩阵

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ299.html 前言 不会概率题的菜鸡博主做了一道概率题. 写完发现运行效率榜上的人都没有用心卡常数——矩阵怎么可以用数组 ...

  4. 使用HTML5开发Kinect体感游戏

    一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...

  5. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  6. Unity游戏内版本更新

    最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...

  7. 游戏服务器菜鸟之C#初探一游戏服务

    本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...

  8. iOS审核这些坑,腾讯游戏也踩过

    作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...

  9. 漫谈C#编程语言在游戏领域的应用

    0x00 前言 随着微软越来越开放,C#也变得越来越吸引人们的眼球.而在游戏行业中,C#也开始慢慢地获得了关注.这不, 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发,跨平台 ...

随机推荐

  1. 解决本地Bootstrap字体图标不可见的问题

    原文:https://www.jianshu.com/p/70ac459d33e7 作为Bootstrap的初学者,我最近遇到了一个问题:在使用Bootstrap字体图标时,图标不可见.使用代码如下: ...

  2. CentOS7配置网卡上网、安装wget、配置163yum源

    2019/09/12,CentOS 7 VMware 摘要:CentOS7安装完成(最小化安装)后,不能联网(已选择桥接网络),需要修改配置文件及配置yum源 修改配置文件 进入网卡配置目录 cd / ...

  3. React 语法

    1.JavaScript XML JSX = JavaScript XML,是一个看起来很像 XML 的 JavaScript 语法扩展.JSX 不是模板,是JS语法本身,有更多的扩展.JSX 组件一 ...

  4. k8s维护常用命令

    k8s维护 1. 不可调度 kubectl cordon k8s-node-1 kubectl uncordon k8s-node-1 #取消 2.驱逐已经运行的业务容器 kubectl drain ...

  5. OC中并发编程的相关API和面临的挑战

    OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文 ...

  6. 如何自行给指定的SAP OData服务添加自定义日志记录功能

    有的时候,SAP标准的OData实现或者相关的工具没有提供我们想记录的日志功能,此时可以利用SAP系统强大的扩展特性,进行自定义日志功能的二次开发. 以SAP CRM Fiori应用"My ...

  7. PDF 补丁丁 0.6.2.3572 测试版发布

    近日有网友反馈 3571 测试版的补丁丁无法正常工作.请下载新发布的 3572 版本.

  8. Redis中如何发现并优化big key?

    Redis中的大key一直是重点需要优化的对象,big key既占用比较多的内存,也可能占用比较多的网卡资源,造成redis阻塞,因此我们需要找到这些big key进行优化 一.寻找big key 通 ...

  9. angularcli 第七篇(service 服务)

    在组件中定义的信息是固定的,假设另外一个组件也需要用到这些信息,这时候就用到服务,实现 共享数据 和 方法 组件不应该直接获取或保存数据,它们不应该了解是否在展示假数据. 它们应该聚焦于展示数据,而把 ...

  10. Python入门篇-高阶函数

    Python入门篇-高阶函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.高级函数  1>.First Class Object 函数在Python中是一等公民 函数也 ...