CF 792 F Mages and Monsters 题解

CF 792 F Mages and Monsters 题解

分享一个和官方题解不一样的做法。

首先对于给定的条件做一些转变:

原条件为:一种咒语在一秒内能打出\(x\)的伤害,消耗\(y\)的法力。

可以转变成:一种咒语,打出1的伤害,需要消耗\(\frac{y}{x}\)的法力,\(\frac{1}{x}\)的时间。

\(t\)时间内,拥有法力值为\(m\),能打出的最大伤害是多少?

然后把它转变成线性规划问题,令第\(i\)种咒语打出的伤害为\(d_i\)

\[ \max\{\sum d_i\} \]

\[s.t. \]

\[\sum \frac{y_i}{x_i}d_i\leq m \]

\[\sum \frac{1}{x_i}d_i\leq t \]

可以发现只有两个约束,所以很自然可以想到对偶。

令限制1和限制2的对偶变量为\(p_1,p_2\)

则原问题变成:

\[\min\{mp_1+tp_2\} \]

\[s.t. \]

\[\forall_i \frac{y_i}{x_i}p_1+\frac{1}{x_i}p_2\geq 1 \]

对于限制稍作变换 : \(p_2\geq x_i-y_ip_1\)

众所周知,线性规划目标函数值关于于每一个变量都是凸的,所以可以三分\(p_1\)\(p_2\)的取值就是\(\max\{0,x_1-y_1p_1,x_2-y_2p_1...,x_n-y_np_1\}\)

\(x_i-y_ip_1\)这个式子又可以看成一个关于\(p_1\)的直线。

这样问题就变成了,加入直线,查询某一位置的最大点值。

这个可以用动态开点李超树/set维护。

这样加上三分的时间复杂度为\(O(N\log^2N)\),足以通过本题。

代码:Submission #135635363 - Codeforces

posted @ 2021-11-15 17:52  WWW~~~  阅读(67)  评论(0编辑  收藏  举报