【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#开发,跨平台 ...
随机推荐
- yii框架无限极分类的做法
用yii框架做了一个无限极分类,主要的数组转换都是粘贴的别人的代码,但还是不要脸的写出来,方便以后自己看 用的是递归,不是path路径 控制器: protected function subtree( ...
- C#录制屏幕采集系统桌面画面
在项目中,有很多需要录制屏幕的场景,比如直播课,录制教学视频等场景.但.NET自带的Screen类功能比较弱,效率很低.那么如何简单快捷地高效采集桌面屏幕呢?当然是采用SharpCapture!下面开 ...
- k8s安装部署问题、解决方案汇总
角色 节点名 节点ip master n1 192.168.14.11 节点1 n2 192.168.14.12 节点2 n3 192.168.14.13 https://raw.githubuser ...
- 修复使用sub和sup时的行间距问题
sub和sup元素会轻微地增大行高. 幸好,用一点CSS就可以修复这个问题. 来自Nicolas Gallagher和Jonathan Neal的normalize.css(http://necola ...
- laravel项目中通过nvmw安装node.js和npm 开发环境-- windows版
windows版本安装 此教程执行的时候,网速一定要好.不然可能出现各种错误. 如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ git clone nvmw 直接从 githu ...
- 判断OpenCV是否为共享库,Windows基于CMake编译Caffe需要opencv共享库
判断OpenCV是否为共享库,Windows基于CMake编译Caffe需要opencv共享库 TLDR 只考虑windows下opencv预编译包的情况. 对于opencv2.4.x系列,cmake ...
- FreeBSD安装后使用su命令显示sorry的解决办法
FreeBSD中,可以使用su命令成为root用户,但FreeBSD对执行su命令的用户进行了更严格的限制,能使用su命令的用户必须属于wheel组(root的基本属组,组ID为0),否则就不能通过 ...
- mysql的innodb数据存储结构
数据库磁盘读取与系统磁盘读取 1,系统从磁盘中读取数据到内存时是以磁盘块(block)为基本单位,位于同一个磁盘块中的数据会被一次性读取出来. 2,innodb存储引擎中有页(Page)的概念,页 ...
- Linux命令——lsblk
参考:Linux lsblk Command Tutorial for Beginners (8 Examples) 简介 lsblk可以看成是“List block device”的缩写,即列为出所 ...
- 20.centos7基础学习与积累-006-软实力-画图
从头开始积累centos7系统运用 亿图是用指南 安装亿图软件 修改基础配置 路径:文件==>选项==>常规 需要修改的参数: 撤销次数:256 自动保存间隔:2分钟 路径:文件==> ...