「CTSC2017-游戏」题解

news/2025/10/27 19:10:41/文章来源:https://www.cnblogs.com/LastKismet/p/19169901

P3772 [CTSC2017] 游戏

sol

首先,由期望的线性性,把贡献拆到单点上,对每一场计算其胜利的概率即可。

首先已知的局可以不管,未知的局,显然只与其两侧最近的已知局有关。后面运用的一些概率表达在题面最下面有提到,就不额外解释了。

\(L,R\) 分别为两侧已知局与已知状态相同的事件,\(X\) 表示当前局获胜的概率,那么我们就是要求:\(p(X\mid LR)\)。这个游戏是一个 Markov 过程,每个状态只依赖于上一个状态转移,则可以推出下式:

\[\begin{aligned} p(X\mid LR)&=\frac{p(XLR)}{p(LR)}\\ &=\frac{p(L)p(X\mid L)p(R\mid X)}{p(L)p(R\mid L)}\\ &=\frac{p(X\mid L)p(R\mid X)}{p(R\mid L)} \end{aligned} \]

感性理解这个式子的话也是简单的,就是 \(L\) 必然发生时,\(XR\) 同时发生的概率比上 \(R\) 发生的概率,也就是要求的 \(X\) 发生的概率。

这个东西已经可以求了,考虑优化,上面说到每个局只与相邻两个已知局有关,那么考虑对一个未知局连续段统一计算。

分母是易求的,只需要顺序递推一下即可,有转移方程:

\[f(i,1)=p_if(i-1,1)+q_if(i-1,0)\\ f(i,0)=(1-p_i)f(i-1,1)+(1-q_i)f(i-1,0) \]

状态设计显然。考虑分子,也就是钦定 \(x\) 处必胜,并对所有情况求和。这个直接状态设计的话有点复杂,这里就略去了,因为后面介绍的转移方式很方便。

那么考虑 set 维护所有已知点,更新时动态计算变化的连续段答案,利用矩阵把转移挂到线段树上区间求和即可。

设计状态矩阵,两个事件分别表示当前赢和输:

\[\begin{bmatrix} p(W)&p(L) \end{bmatrix} \]

\(f\) 的转移矩阵设计直接照搬即可:

\[\begin{bmatrix} p_i&(1-p_i)\\ q_i&(1-q_i) \end{bmatrix} \]

考虑分子,钦定一个点必胜是简单的,把那个位置的转移矩阵改成下面这个样子即可:

\[\begin{bmatrix} p_i&0\\ q_i&0 \end{bmatrix} \]

在线段树上维护钦定一个点的所有情况求和是简单的,每个节点额外维护一个矩阵信息 \(G\) 表示区间已有一个钦定点的状态,记当前节点为 \(x\),两个子儿子分别为 \(ls\)\(rs\),区间转移矩阵信息记作 \(F\),有转移:

\[G_x=G_{ls}F_{rs}+F_{ls}G_{rs} \]

意义显然。

具体实现细节的话,可以考虑钦定 \(0,n+1\) 必胜来方便代码,其余的就参照代码实现吧。

code

const int N=2e5+5;struct Mat{flt dat[2][2];Mat(){rep(i,0,1)rep(j,0,1)dat[i][j]=0;}Mat(flt a,flt b,flt c,flt d){dat[0][0]=a,dat[0][1]=b,dat[1][0]=c,dat[1][1]=d;}inline flt* operator[](int k){return dat[k];}friend inline Mat operator*(Mat a,Mat b){Mat c;rep(i,0,1)rep(j,0,1)rep(k,0,1)c[i][j]+=a[i][k]*b[k][j];return c;}friend inline Mat operator+(Mat a,Mat b){Mat c;rep(i,0,1)rep(j,0,1)c[i][j]=a[i][j]+b[i][j];return c;}
};int n,m;
flt p[N],q[N];
set<int> st;
bool w[N];
int ck;flt cn;Mat M[N],dat[N<<2],pro[N<<2];
void build(int x=1,int l=1,int r=n){if(l==r){dat[x]=M[l]={p[l],1-p[l],q[l],1-q[l]};pro[x]={p[l],0,q[l],0};return;}int m=l+r>>1;build(x<<1,l,m);build(x<<1|1,m+1,r);dat[x]=dat[x<<1]*dat[x<<1|1];pro[x]=pro[x<<1]*dat[x<<1|1]+dat[x<<1]*pro[x<<1|1];
}
pair<Mat,Mat> query(int lq,int rq,int x=1,int l=1,int r=n){if(lq<=l&&r<=rq)return {dat[x],pro[x]};int m=l+r>>1;if(rq<=m)return query(lq,rq,x<<1,l,m);if(m<lq)return query(lq,rq,x<<1|1,m+1,r);auto resl=query(lq,rq,x<<1,l,m),resr=query(lq,rq,x<<1|1,m+1,r);return {resl.fir*resr.fir,resl.sec*resr.fir+resl.fir*resr.sec};
}
inline flt calc(int l,int r){if(l==r-1)return 0;Mat m;m[0][w[l]^1]=1;auto res=query(l+1,r-1);Mat sum=m*res.fir*M[r],prd=m*res.sec*M[r];return prd[0][w[r]^1]/sum[0][w[r]^1];
}inline void Main(){char type;cin>>n>>m>>type;cin>>p[1];rep(i,2,n)cin>>p[i]>>q[i];st.insert(0),st.insert(n+1);build();M[n+1]={1,0,1,0};w[0]=w[n+1]=1;cn=calc(0,n+1);rep(i,1,m){string op;cin>>op;if(op=="add"){int x,c;cin>>x>>c;if(w[x]=c)++ck;auto it=st.lower_bound(x);int r=*it;int l=*--it;cn+=calc(l,x)+calc(x,r)-calc(l,r);st.insert(x);}else{int x;cin>>x;if(w[x])--ck;auto it=st.upper_bound(x);int r=*it;int l=*----it;cn+=calc(l,r)-calc(l,x)-calc(x,r);st.erase(x);}put(ck+cn);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谢谢你周医生

谢谢你 周敏,张景     南京很美,想起你们我的心也很温暖

想让默认头像不再千篇一律,就顺手复刻了一下 GitHub 的思路

探索如何让默认头像不再千篇一律,我用 Go 复刻了 GitHub 风格的头像生成逻辑,根据输入生成独一无二的方块头像。文章分享了实现原理、效果展示以及未来扩展的思路在各种平台上,初始注册的用户通常都会被分配一个默认…

来源未知

点击查看代码 from PIL import Image# 定义字符集合 ascii_char = list("$@B%8&W#*oahkbdpqwmZO0QLCJYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`. ")def get_char(r, g, b, alpha=256):if a…

10.27(补)

继承和多态的动手动脑整理的word补上 链接:[https://files.cnblogs.com/files/blogs/847692/20243732张博学课后作业4.zip?t=1761562926&download=true]

vue3 vue3-form-element表单生成工具 输入框增加后缀

JSON schema数据{"title": "测试注册表单","description": "A simple form example.","type": "object","properties": {"firstName&quo…

java(3)基础规范

Java对大小写敏感。 关键字class的意思是类。JAVA是面向对象的语言,所有代码必须位于类里面。 编译后的源文件,得到相应的字节码文件,编译器为每个类生成独立的字节码文件。 main方法是JAVA应用程序的入口方法。格式…

袁天罡称骨歌的评骨格歌诀 - 木易

二两一钱:男:此命非业谓大凶,平生灾难事叠重,凶祸频临陷逆境,终世困苦事不成。女:生身此命运不通,乌云盖月黑朦胧,莫向故园载花木,可来幽地种青松。二两二:男:此命推来真气人,身寒骨冷若伶仃,劳劳碌碌虚度…

stm32F411RETx系列无CAN的处理思路

CAN 考虑到STM32F411RETX系列根本没有CAN,这该怎么办呢? 我在网上搜索到了一个解决方法: 使用一个独立的 CAN控制器芯片(如 MCP2515,这是最常用的选择),通过 SPI接口与 STM32通信。STM32 作为主机,通过 SPI协议…

Date 10.27

在 Print 之前 到现在还是想不明白为什么不骗那显眼的 80pts。 赛时 420/500pts,T5放了道紫。 A - 玩数字P.S. \(n \le 10^{15}\) 唐题,可以 \(O(\sqrt n)\) 解决,中间进行数位分离即可,当然你也可以打表。 Code #…

20232402 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1 基础免杀技术测试​ (1)msfvenom 编码器免杀: 生成未编码与多次编码的反向连接恶意程序,分别复制到靶机,对比杀软拦截情况,验证编码器对特征码的混淆效果;​ (2)Veil 工具免杀: 通过 Veil 生…

读书日记3

6到10章深入探讨了编程中最基础的元素——变量和数据类型,让我看到了平凡中的非凡。 核心收获与深刻见解: 1.变量命名的艺术性:McConnell详细阐述了优秀变量名的特征——表达"什么"而不是"如何"…

2025年多商户商城代理招募加盟/多商户项目合伙人加盟最新推荐榜:多商户兼职项目合伙人/B2B2C商城代理招募公司/聚焦项目孵化与商户扶持能力深度解析

随着大众创业热潮持续升温,以及数字化商业模式的快速迭代,创业者在选择项目合作方时常常面临多重考量 —— 如何辨别企业项目的可行性、如何匹配自身资源的合作模式、如何降低创业初期的运营风险,成为当下创业者关注…

20232420 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容学会使用msf编码器,veil-evasion,利用shellcode编程,加壳等免杀工具或技巧。尝试实现恶意代码免杀。理解免杀机制和原理,认识到杀软局限性。2.实验过程 2.1 免杀效果参考基准 2.1.1 免杀效果的评价 用Vi…

掘金2025年:数字化商业浪潮下,如何选对平台与伙伴?一站式多商户商城系统推荐榜发布,多商户商城代理招募/多商户项目合伙人加盟/一站式开店代理项目加盟

随着数字化转型深入各行各业,个体创业与企业多渠道拓展需求激增,能够整合资源、快速部署、共享收益的多商户商城模式已成为市场新蓝海。2025年,预计相关平台与服务市场规模将持续扩大,但市场中项目质量、技术支撑与…

Tuack 生成 OI 比赛题目 PDF 笔记

一些关于 Tuack 生成 OI 比赛题目 PDF 的笔记Part 1. Tuack 的基本介绍 Tuack,是一个由来自 THU 的大佬 Mulab11 开发的,用于造算法竞赛题目的工具。 你可以用它:导出 PDF、Markdown、HTML 等多种不同格式,NOI、CP…

为医疗器械行业搭建“数字桥梁”,破解协同效率与合规难题

当传统沟通方式成为行业发展瓶颈,数字化协同正重塑医疗器械供应链的竞争力格局。当传统沟通方式成为行业发展瓶颈,数字化协同正重塑医疗器械供应链的竞争力格局。 “每天在微信、QQ群里有上百条沟通,订单、发货、发…

# 20232312 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1本周学习内容Metasploit 框架使用C语言编程与Shellcode集成跨平台编译技术加壳与免杀技术1.2回答问题 1.2.1杀毒软件如何检测恶意代码? 杀毒软件采用多种技术手段综合判断,主要方法包括:特征码检测原…

PostgreSQL 服务版

PostgreSQL 二进制下载地址 https://www.enterprisedb.com/download-postgresql-binaries尽量使用管理员权限 开始步骤 1.找到下载的目录,我这里使用的是版本18 C:\Users\Administrator\Downloads\pgsql 解压后会得到…

20232307 2025-2026-1 《网络与系统攻防技术》实验三实验报告

20232307 2025-2026-1 《网络与系统攻防技术》实验三实验报告 1. 实验内容 本周学习内容:免杀一般是对恶意软件做处理,让它不被杀毒软件所检测。 杀毒软件原理包括:特征码、启发式、基于行为;文件校验和;云查杀;机…

配置idea创建文件时自动生成注解(如类注释、作者信息等)

可以按照以下步骤操作: 1. 配置类 / 接口的文件模板 适用于创建 Java 类、接口、枚举等文件时自动生成注释:打开设置:File > Settings(Windows/Linux)或 IntelliJ IDEA > Preferences(Mac)进入 Editor &g…