Links there:CF739E
写了个 $O(n^3)$的概率转移 $dp$ 被劝退了不会优化 只能去补姿势
题意
有 $N$ 个怪物,你有 $a$ 个 $Pokeball$ 和 $b$ 个 $Ultraball$.
给出每个怪物分别被 $Pokeball$ 和被 $Ultraball$ 捕获的概率 求最大能捕获个数的期望.
思路
上来抱着 $codeforces $ 跑的巨快的心态写了一发 $O(n^3)$
用 $f(i,j,k)$ 表示 前 $i$ 个怪物用 $j$ 个 $Pokeball$, $k$ 个 $Ultraball$ 的最大期望.
这个转移显然,讨论一下每个怪物
不用球 / 用Pokeball / 用Ultraball / 都用
大概写出来这样子
1 | for (int i = 1; i <= n; ++i) { |
然后你就发现你 $T$ 飞了.
用 $WQS$ 二分的思想
原问题显然必须把 $a,b$ 取光.
所以这实际上是一个有2个限制的取 $K$ 个物品的问题
固定 $f(i,a,k)$ 的 $i,a$ 的时候 , 发现 $f(i,a,k)$ 是关于 $k$ 的凸函数.
这是显然的对于固定的 $i$ ,你扔的球的个数越多的话收益越差.
类似的 , 固定 $f(i,j,b)$ 的 $i,b$ 的时候 , 发现 $f(i,j,b)$ 是关于 $j$ 的凸函数.
那么不如给每个球加两个限制 $cost1 \space cost2$ 表示每个类型的球额外的代价.
二分套二分,最后把这一部分影响还原就是答案.
因为 $cost1 \space cost2$ 的范围在 $[0,1]$ 之间 所以二分的次数很少 (看你 eps)
几乎就是 $O(n\times x^2)$ ,$x$ 为二分常数 可小了.
跑的还真是快呢.
Code
1 | //Keep pluggin',this is your only outlet. |
发现自己一万年没更blog了.之前的题会陆陆续续补上来吧.