【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#开发,跨平台 ...
随机推荐
- 【写法】为什么if判断中,值要倒着写
=============================================== 2019/8/27_第1次修改 ccb_warlock == ...
- The five Day 水平翻转图像,然后反转图像并返回结果
""" 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结 ...
- angular复习笔记3-组件
组件Component 组件是构成angular应用的核心,angular的有序运行依赖于组件的协同工作,组件之于angular应用就像是汽车和汽车零部件的意思. 概述 近几年的前端发展迅速,各种工程 ...
- 相似文档查找算法之 simHash及其 java 实现
传统的 hash 算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法.产生的两个签名,如果相等,说明原始内容在一定概 率 下是相等的:如果不相等,除了说明原始内容不相等外 ...
- django.db.utils.InternalError: (1060, "Duplicate column name 'user_id'")迁移报错解决方法
django.db.utils.InternalError: (1060, "Duplicate column name 'user_id'")迁移报错解决方法 django.db ...
- linux限定用户或组对磁盘空间的使用
实验环境 环境:centos7.3 ,一块磁盘sdb分一个分区sdb1. 安装磁盘配额支持软件 yum install quota 制作文件系统,并以支持配额功能的方式挂载文件系统 mkfs.ext4 ...
- aria2 cmd set chmod, and others..
import 'package:flutter/material.dart'; import 'dart:io'; import 'dart:async'; import 'package:rxdar ...
- JavaScript之控制标签css
控制标签css标签.style.样式='样式具体的值'如果样式出现中横线,如border-radius,将中横线去掉,中横线后面的单词首字母大写,写成borderRadius如果原来就要该样式,表示修 ...
- 推荐一个去除图片人物背景的工具Removebg
可以在线使用,url:https://www.remove.bg/users/sign_in 用邮箱免注册一个免费账号: 注册的邮箱会收到一封激活账号的邮件: 点击Activate account后激 ...
- nodejs 删除空文件
var fs = require("fs") var path = require("path") var listRealPath = path.resolv ...