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)\),足以通过本题。