【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#开发,跨平台 ...
随机推荐
- .Net MVC生成二维码并前端展示
简介: 二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更 ...
- MySQL CentOS7 手动安装
手动安装MySQL的目的: 1.一个服务器上可以同时装多个版本,甚至相同版本MySQL的多个实例,这种需求很常见: 2.一次初始化和配置后,可以快速复制到本服务器或其他服务器,及封装为初始MySQL的 ...
- C++ primer学习笔记_6_函数---函数定义、参数传递
1. 习题参考: 6.14 举一个形参应该是引用类型的例子,再举一个形参不能是引用类型的例子. 答: 形参使用引用类型的情况:(1)避免拷贝传递大对象的时候,这里的string对象s:(2)当需要从函 ...
- Java多线程 常见问题整理
线程 什么是线程 线程是指程序在执行过程中,能够执行程序代码的一个执行单元. 线程和进程的区别 线程:一段程序执行过程中的一个执行单元,各个线程之间共享程序的内存空间以及一些进程级的资源,各线程拥有自 ...
- Github 上 10 个值得学习的 Springboot 开源项目
Spring Boot 几乎继承了所有 Spring 框架的优点,同时还可以让项目的配置更简化.编码更简化.部署更方便.近两年受到很多开发者的追捧,也是火热的不行! 下面给大家整理了 10 个 Git ...
- OpenResty(Nginx + Lua)常用操作
平滑重启: /usr/servers/nginx/sbin/nginx -s reload 重启前测试配置是否成功 /usr/servers/nginx/sbin/nginx -t 平滑升级如果服 ...
- Python的高级文件操作(shutil模块)
Python的高级文件操作(shutil模块) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让我们用python的文件处理来进行文件拷贝,想必很多小伙伴的思路是:使用打开2个 ...
- HashMap扩容死循环问题
原文:https://blog.csdn.net/Leon_cx/article/details/81911223 下面我们来模拟一下多线程场景下扩容会出现的问题: 假设在扩容过程中旧hash桶中有一 ...
- CVE-2019-0708:RDP终极EXP复现
0x00 前言 每次复现都会遇到各种各样的问题,这次也不例外,经过多次尝试才复现成功,因此把可能的解决方法也和大家分享一下,有想要一起复现学习/投稿的可以联系我哈 0x01 影响版本 Windows ...
- SMBus PEC
SMBus一种I2C总线的变种 SMBus 提供了PEC方式,提高了传输的可靠性. 总线的发展都是在提高速度,提高可靠性或者提高传输效率上下功夫. PEC不具备纠错的能力,是在I2C link lay ...