CF1067D - Computer Game
CF1067D - Computer Game
题目大意
给定 \(n\) 个操作,每个操作有1级和2级分别对应价值 \(a_i,b_i (a_i<b_i)\) ,初始每个操作为 \(1\) 级
每次操作 \(i\) ,有 \(p_i\) 概率操作成功,这会获得价值,并且获得一次升级的机会
求 \(t\) 次操作的期望最大权值和
分析
容易发现,当你拿到一次升级后,一定就一直选择 \(\max\{p_i\cdot b_i\}\) 进行操作
并且每次期望获得这么多的权值,不妨设 \(m=\max\{p_i\cdot b_i\}\)
需要决策的是拿到这个权值之前,选择哪一个操作
设 \(dp_i\) 表示有 \(i\) 次操作机会时的期望答案,则得到 \(dp\) 转移式子
\(\displaystyle dp_i=\max_{j\leq n}\{ p_j((i-1)m+a_j)+(1-p_j)dp_{i-1} \}\)
考虑这是一个斜率优化的形式,我们做一下变形
\(dp_i=\max\{ p_j((i-1)m-dp_{i-1}) +dp_{i-1}+p_ja_j\}\)
可以看到斜率优化与 \((i-1)m-dp_{i-1}\) 有关,设 \(g_i=im-dp_{i}\)
则问题可以转化为求 \((g_t)_{\min}\)
转化之后得到 \(g_i\) 的转移式
\(\displaystyle g_{i}=\min_{j\leq n} \{g_{i-1} (1-p_j)+m-a_jp_j\}\)
容易发现这样的转移相较于 \(dp_i\) ,脱离了 \(im\) 的问题
不妨对于 \((1-p_j,m-a_jp_j)\) 建立凸包,则转移可以斜率优化
现在考虑 \(g_i\) 的单调性,根据定义式我们可以感性地理解 \(g_i\) 是递增的(因为 \(dp_i\) 增率不可能超过 \(m\) )
(事实上我并不知道怎么根据转移式说明它是单调的)
既然是 \(g_i\) 是单调,那么转移在凸包上的位置也是单调的,因此可以直接在凸包上移动决策点
倍增|二分完成操作
复杂度为 \(O(n(\log n+\log t))\) 或 \(O(n(\log n+\log^2 t))\)
吐槽
Codeforces上写double ,long double真的磨人
还有一群疯子构造数据把两个点的 \(x_i,y_i\) 相差 \(10^{-9}\)
什么玩意儿,搞得我把 \(\text{eps}\) 开成 \(10^{-20}\)
1 | const int N=1e5+10,INF=1e9+10; |