【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#开发,跨平台 ...
随机推荐
- C# 多线程与高并发处理并且具备暂停、继续、停止功能
--近期有一个需要运用多线程的项目,会有并发概率,所以写了一份代码,可能有写地方还不完善,后续有需求在改 1 /// <summary> /// 并发对象 /// </summary ...
- K8S 中的容器编排和应用编排
众所周知,Kubernetes 是一个容器编排平台,它有非常丰富的原始的 API 来支持容器编排,但是对于用户来说更加关心的是一个应用的编排,包含多容器和服务的组合,管理它们之间的依赖关系,以及如何管 ...
- 关于使用jquery form submit出现多次提交的问题
错误的写法: $(this).submit(function () { $(this).ajaxSubmit({ url: opts.url, type: 'post', dataType: 'jso ...
- XXL-JOB使用命令行的方式启动python时,日志过多导致阻塞的解决方式
一.Runtime.getRuntime().exec()的阻塞问题 这个问题也不能算是XXL-JOB的问题,而是Java的Runtime.getRuntime().exec()造成的,Buffere ...
- Java自学-控制流程 结束外部循环
Java中结束外部循环 Java中如何结束外部for循环? 示例 1 : 结束当前循环 break; 只能结束当前循环 public class HelloWorld { public static ...
- TypeScript基础以及在Vue中的应用
TypeScript推出已经很长时间了,在Angular项目中开发比较普遍,随着Vue 3.0的即将推出,TypeScript在Vue项目中使用也即将成为很大的趋势,笔者也是最近才开始研究如何在Vue ...
- jquery实现倒计时
<html> <head> <meta charset="utf-8"/> <title>jquery实现倒计时</title ...
- scrapy文件管道
安装scrapy pip install scrapy 新建项目 (python36) E:\www>scrapy startproject fileDownload New Scrapy pr ...
- python系列:一、Urllib库的基本使用
开篇介绍: 因为我本人也是初学者,爬虫的例子大部分都是学习资料上面来的,只是自己手敲了一遍,同时加上自己的理解. 写得不好请多谅解,如果有错误之处请多赐教. 我本人的开发环境是vscode,pytho ...
- 身份证验证PHP类
PHP根据身份证号,自动获取对应的星座函数,然后自动返回对应的星座,自动返回性别,判断是否成年 <?php class IdcardAction extends Action{ // PHP根据 ...