【loj2263】【CTSC2017】游戏
题目
小\(R\)和小\(B\)一共完了\(n\)局游戏,第一局小\(R\)获胜的概率为\(p_i\),没有平局,对于第$ i $局游戏:
- 如果第\(i-1\)局游戏小$ R \(获胜,那么第 局游戏小\) R $获胜的概率为 \(p_i\),小$ B $获胜的概率为 \(1-p_i\)
- 如果第\(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】游戏的更多相关文章
- [CTSC2017]游戏(Bayes定理,线段树)
传送门:http://uoj.ac/problem/299 题目良心给了Bayes定理,但对于我这种数学渣来说并没有什么用. 先大概讲下相关数学内容: 1.定义:$P(X)$ 表示事件$X$发生的概率 ...
- 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 ...
- UOJ#299. 【CTSC2017】游戏 线段树 概率期望 矩阵
原文链接www.cnblogs.com/zhouzhendong/p/UOJ299.html 前言 不会概率题的菜鸡博主做了一道概率题. 写完发现运行效率榜上的人都没有用心卡常数——矩阵怎么可以用数组 ...
- 使用HTML5开发Kinect体感游戏
一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
- Unity游戏内版本更新
最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...
- 游戏服务器菜鸟之C#初探一游戏服务
本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...
- iOS审核这些坑,腾讯游戏也踩过
作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...
- 漫谈C#编程语言在游戏领域的应用
0x00 前言 随着微软越来越开放,C#也变得越来越吸引人们的眼球.而在游戏行业中,C#也开始慢慢地获得了关注.这不, 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发,跨平台 ...
随机推荐
- Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器
Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: 1. 可以在局部作用域声明一 ...
- hadoop细节 -> 持续更新
Hdfs: hdfs写流程: 客户端通过DistributedFileSystem请求namenode上传文件 Namenode进行检查,比如父路径 文件本身,是否允许上传 Namenode相应信 ...
- api封装
const sql={ insert: function(collection,insertData){ return new Promise(function(resolve,reject){ co ...
- 美国LangeEylandt长岛
LangeEylandt n.长岛(美国) 纽约长岛 纽约长岛 (LongIsland)是北美洲在大西洋内的一个岛,最早追溯到十七世纪的1650年被命名为Lange Eylandt [1] ,位于北美 ...
- Jmeter学习笔记(二十)——后置处理器XPath Extractor使用
一.背景 在使用过程某些操作步骤与其相邻步骤存在一定的依赖关系,需要需要将上一个请求的响应结果作为下一个请求的参数. Jmeter中后置处理器正则表达式提取器和XPath Extractor都可以将页 ...
- 源码解析-url状态检测神器ping-url
前言 ping-url是我最近开源的一个小工具,这篇文章也是专门写它设计理念的科普文. 为什么会做这个ping-url开源工具呢? 起因是:本小哥在某天接到一个特殊的需求,要用前端的方式判断任意一个u ...
- base64的使用
import base64with open("test.jpg", "rb") as f: file = f.read()file_base64 = base ...
- ELK Stack部署
部署ELK Stack 官网:https://www.elastic.co 环境准备: ip hostname 服务 用户.组 192.168.20.3 node2003 kibana6.5,file ...
- 浅谈Linux下傻瓜式磁盘分区工具cfdisk的使用
对于新手来说,Linux环境下的磁盘分区可能还会存在一些困难.对于熟悉Linux的朋友来说,我们还有fdisk.parted(2TB以上的磁盘分区使用)等磁盘分区工具可以使用.在我们新增磁盘或者在原来 ...
- CentOS7.5安装SVN和可视化管理工具iF.SVNAdmin
一.安装Apache和PHP 由于iF.SVNAdmin使用php写的,因此我们需要安装php yum install httpd php 二.安装SVN服务器(其中,mod_dav_svn是Apac ...