CF1975I solution

Preface

神仙题。模拟赛 \(46\) 个人在这个题一共得了 \(30\) 分。太难想了,代码倒挺好写。

平凡情况

先有几种平凡的情况使得答案为 \(0\)\(1\)。优先级依次递减。

  • 初始时 \(|S|=n\),答案为 \(1\)
  • 初始时 \(|S|=0\),答案为 \(0\)
  • 初始时 \(a_n\leq 1\),每次都不会让手里的牌变多,会逐渐输干净,答案为 \(0\)
  • 初始时 \(a_1\ge 0\),手里的牌数不减,并且此时 \(a_n>1\),可以变多,答案为 \(1\)

基础分析

由于 \(c_i\) 单调不降,并且相同能力值之间事实上互不区分,但是方便起见,每一轮我们可以直接认为打出去的是标号最大的那张。因此我们讨论某张手牌的标号而不是能力值。

\(S\) 表示水母手中牌的集合,把平凡的情况去除后一定有 \(a_1\ge 0,a_n>1\) 且初始时 \(|S|\in[1,n-1]\)

下文定义 \(\text{operate}(S)=\text{operate}\lbrace{i\in S}\mid i\rbrace\)

正难则反,我们不好刻画赢牌,但是可以注意到输光的过程一定是在最后打空了所有能力值非零的卡牌,手中要么为空要么全是能力值为 \(0\),此时是必败的。我们可以计算水母输牌的概率 \(ans'\),最终答案 \(ans\) 就是 \(1-ans'\)

这一定是一个 DP 题,但是我们需要合适地划分子过程,对应 DP 的分阶段递推。在本题中,可以用实时的 \(\max(S)\) 来考虑。最终就是 \(\max(S)=0\) 就输了,但是将 \(\max(S)\) 画成一条折线时,整体趋势就是往下掉,最后掉成 \(0\),没有必要是单调减的,但是考虑一个时刻的 \(\max(S)\) 达成了历史最小时(前缀 \(\min\)),就可以看成一个新的阶段了。

因此可以将整个掉的过程划分成若干子过程。从这个 \(\max(S)=k\) 的时刻逐渐操作,到后面首次时刻使得 \(\max(S)<k\),最终 \(\max(S)=0\)

DP 设计

在往下掉的过程中,\(\max(S)\) 可能会往上走,但是原来的 \(S_i\)\(S_i\ne \max(S)\) 是几乎没用的,所以可以只考虑这个过程开始时的 \(|S|\)

考虑 DP 记录什么。假设水母当前在 \(\max(S)=i,|S\setminus\lbrace i\rbrace|=x\) 的状态,令下一个子过程开始时的 \(|S|=y\),那么可以设计 DP 为 \(f_{i,x,y}\):下一个 \(\max(S)<i\) 的首个状态时,\(|S|=y\) 的概率。

我们希望对于固定的二元组 \((i,x)\) 求出所有的 \(f_{i,x,y}\)。打出卡牌 \(i\) 之后会剩下 \(n-x\) 张卡牌,她们有相等可能被水母的 \(a_i\) 张之一抽中。因此这些卡牌在当前抽卡轮的持有的概率都是 \(\dfrac{a_i}{n-x}\)

之前说了,\(\max(S)\) 可能会往上飘,但是我们希望在上飘时也考虑往下掉的过程。考虑令时间线的起点为打出 \(i\),后续有 \(n-i+2\) 个关键时刻:\(\max(S)\) 第一次 \(\leq n\)\(\max(S)\) 第一次 \(\leq n-1\)\(\cdots\)\(\max(S)\) 第一次 \(\leq i+1\)\(\max(S)\) 第一次 \(\leq i\)\(\max(S)\) 第一次 \(\leq i-1\)

\(g_{j,y}\) 表示到达首次 \(\max(S)\leq j\) 的状态时,\(|S|=y\) 的概率。打出 \(i\) 那一轮即初始时一定满足 \(g_{n,x+a_i}=1\),其余的 \(g_{n,*}\) 均为 \(0\)

此时考虑 \(g_{j,y}\)。所有 \(\leq j\) 且不是初始 \(x\) 个的卡牌都是对称的,因此拥有卡牌 \(j\) 的概率为 \(p=\dfrac{y-x}{j-x}\),这时考虑往下一层 \(g_{j-1,*}\) 的转移。

  • 若水母没有卡牌 \(j\),就有 \((1-p)g_{j,y}\to g_{j-1,y}\),原因是此时 \(\leq j\) 等价于 \(\leq j-1\)
  • 若水母有卡牌 \(j\),枚举下一个 \(\max(S)\leq j-1\)\(|S|=q\),这种情况的发生概率为 \(f_{j,y-1,q}\)。因此有转移 \(pg_{j,y}f_{j,y-1,q}\to g_{j-1,q}\)

显然有 \(f_{i,x,y}=g_{i-1,y}\)

额外解释:而时间线开始前的 \(S\setminus\lbrace i\rbrace\) 的那 \(x\) 个都是现在集合里的常驻角色,考虑 \(\leq j\) 且不是初始的 \(x\) 个都是对称的。

这是首次 \(\max(S)\leq j\),那么之前打出的卡牌一定都是 \(>j\) 的,那么从这些打出的牌来看,\(\leq j\) 的牌都是等价,对称的。

整体上倒序遍历 \(i\),倒序遍历 \(x\) 求解所有 \(f_{i,x,*}\) 可以保证不会访问未计算的值。

但是如果在求解 \(g\) 时假设 \(j=i,x=y-1\)\(f_{i,x,q}\) 会贡献给 \(g_{i-1,q}\),然后再返还给 \(f_{i,x,q}\) 自身。这样的转移有自环。解决方案就是考虑转移可以规约成 \(f_{i,x,y}=A+Bf_{i,x,y}\),其中 \(B_{i,x,y}\) 就是自己贡献给自己的系数。那么有 \(f_{i,x,y}=\dfrac{A}{1-B}\)。事实上不会有 \(B=1\) 的情况。

这样我们就 \(O(n^5)\) 地求出了所有的 \(f_{i,x,y}\)

统计答案

重新定义 \(s_i=\sum_{j=1}^i[j\in S']\)\(S'\) 为最开始的卡牌集合。

定义 \(h_{i,x}\) 为:若水母从,最初位于 \([1,i]\)\(s_i\) 张卡牌,以及,\([1,i]\) 剩余的 \(i-s_i\) 张她最开始没有的,等概率随机抽取 \(x-s_i\) 张卡牌,这一共 \(x\) 张牌:此时进行游戏,最终打空非零卡牌即输掉的概率的期望。

从小到大枚举 \(i\),初始若 \(a_i=0\)\(h_{i,j}=1\)

  • \(i\in S'\)\(h_{i,x}=\sum_y f_{i,x-1,y}h_{i-1,y}\)
  • \(i\not\in S'\),则有 \(p=\dfrac{x-s_i}{i-s_i}\) 的概率在 \(S\) 中。当 \(i=s_i\) 时显然不会执行这一步。若在 \(S\) 中,对上一句的转移整体乘 \(p\);若不在 \(S\) 中,\(h_{i,x}\) 加上 \((1-p)h_{i-1,x}\)

这一部分容易 \(O(n^3)\) 完成。

最终答案为 \(1-h_{n,s_n}\),就是赢得游戏的概率。

总时间复杂度 \(O(n^5)\),常数较小可以通过。

代码

CF 提交记录。

posted on 2024-08-23 00:13  nullptr_qwq  阅读(32)  评论(0)    收藏  举报