洛谷P3772/LOJ2263/UOJ299/BZOJ4902[CTSC2017]游戏(概率期望+矩阵+线段树)
时间:2019-08-21
本文章向大家介绍洛谷P3772/LOJ2263/UOJ299/BZOJ4902[CTSC2017]游戏(概率期望+矩阵+线段树),主要包括洛谷P3772/LOJ2263/UOJ299/BZOJ4902[CTSC2017]游戏(概率期望+矩阵+线段树)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一个显然结论是每次的期望只和前后最近的已知结果有关。
另一个结论是:若$[x,y]$内$x$次胜负状态为$a$,$y$次为$b$的期望胜利次数为$E$,概率为$P$,则钦定$x$,$y$次分别为$a$,$b$后期望为$\frac{E}{P}$。(这个可以由贝叶斯定理想)
而固定起点的$E_0,E_1$,$P_0,P_1$可以由前一个推出,典型矩阵的套路,线段树维护即可。
但是注意期望是要相加的,也就是线段树合并期望矩阵的时候要写$matE_o=matE_{lc}\times matP_{rc}+matP_{lc}\times matE{rc}$(左区间期望*这一状态在右区间的概率=左区间对完整区间期望的贡献,右区间同理),注意矩阵没有交换律,不要乘反!
#include<cstdio> #include<cstring> #include<set> using namespace std; const int N=200050; char opt[5]; int n; bool d[N]; double p[N],q[N]; set<int> S; struct mat{ double a[2][2]; mat(){a[0][0]=a[0][1]=a[1][0]=a[1][1]=0;} mat(double w,double x,double y,double z){a[1][1]=w;a[1][0]=x;a[0][1]=y;a[0][0]=z;} inline mat operator +(const mat &b)const{return mat(a[1][1]+b.a[1][1],a[1][0]+b.a[1][0],a[0][1]+b.a[0][1],a[0][0]+b.a[0][0]);} inline mat operator *(const mat &b)const{return mat(a[1][0]*b.a[0][1]+a[1][1]*b.a[1][1],a[1][0]*b.a[0][0]+a[1][1]*b.a[1][0],a[0][0]*b.a[0][1]+a[0][1]*b.a[1][1],a[0][0]*b.a[0][0]+a[0][1]*b.a[1][0]);} }; struct node{ mat E,P; node(){} node(mat E,mat P):E(E),P(P){} inline node operator +(const node &b)const{return node(E*b.P+P*b.E,P*b.P);} }sum[N<<2]; void build(int o,int L,int R){ if(L==R)sum[o]=node(mat(p[L],0,q[L],0),mat(p[L],1-p[L],q[L],1-q[L])); else{ int lc=o<<1,rc=lc|1,M=L+R>>1; build(lc,L,M);build(rc,M+1,R); sum[o]=sum[lc]+sum[rc]; } } node ask(int o,int L,int R,int x,int y){ if(x<=L&&y>=R)return sum[o]; else{ int lc=o<<1,rc=lc|1,M=L+R>>1; if(x<=M)if(y>M)return ask(lc,L,M,x,y)+ask(rc,M+1,R,x,y); else return ask(lc,L,M,x,y); else return ask(rc,M+1,R,x,y); } } double query(int x,int y){ node s=ask(1,0,n+1,x+1,y); return s.E.a[d[x]][d[y]]/s.P.a[d[x]][d[y]]; } int main(){ int m,i,x; double ans; set<int>::iterator pre,nxt; scanf("%d%d%s%lf",&n,&m,opt,p+1); for(i=2;i<=n;++i)scanf("%lf%lf",p+i,q+i); p[0]=q[0]=1.0;d[0]=1; //第一次胜率钦定为pi,那就钦定0次赢了 S.insert(0);S.insert(n+1); build(1,0,n+1); ans=query(0,n+1); while(m--){ scanf("%s%d",opt,&i); if(opt[0]=='a'){ scanf("%d",&x);d[i]=x; //不要用scanf("%d",d+i),scanf会把4个bool当成一个int 改掉 pre=nxt=S.upper_bound(i);--pre; ans+=query(i,*nxt)+query(*pre,i)-query(*pre,*nxt); S.insert(i); }else{ pre=nxt=S.upper_bound(i);--pre;--pre; ans+=query(*pre,*nxt)-query(*pre,i)-query(i,*nxt); S.erase(++pre); } printf("%.6lf\n",ans); } return 0; }
原文地址:https://www.cnblogs.com/sunshine-chen/p/11388753.html
- listview动态获取数据
- toggbutton
- android软件开发之webView.addJavascriptInterface循环渐进【一】
- android的listview item点击详解
- android之surfaceview画图
- viewgroup实现item拖动效果
- Android之ExpandableListView下拉分组的实现
- 粗略的物体碰撞预测及检测
- Regionserver频繁挂掉故障处理实践
- 【翻译】GeoJSON格式规范-RFC7946
- [机器学习]-[数据预处理]-中心化 缩放 KNN(二)
- 基于Spring Cloud 几行配置完成单点登录开发
- 深入浅出全栈工程师: Web编程基础
- android之动画popowindows
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- k8s问题记录
- Hexo博客Next主题浏览统计不显示
- 视频上云网关平台EasyCVR使用海康SDK拉流协议分析
- 计算机网络物理层习题
- 从数据库中查询马上过生日的人并统计各年龄段及性别所占的人数
- Ubuntu19.10 中安装 JDK
- 在 Ubuntu19.10 上安装 wine 并安装 QQ 等软件
- wordpress迁移至hugo及其自动化发布文章全记录
- 视频流媒体平台EasyNVR硬件设备使用华科云arm版如何修改为固定IP?
- 详解 IP 地址
- k8s解决pod调度不均衡的问题
- 如何获取视频流媒体服务器EasyNVR的临时授权机器码?
- Mybatis-Plus常用注解
- IDEA 你不知道小技巧——后缀法自动生成代码(Postfix Completion)
- Mybatis-Plus使用乐观锁