标签:打出 frac 法力 题解 sum 伤害 Mages 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
标签:打出,frac,法力,题解,sum,伤害,Mages,Monsters 来源: https://www.cnblogs.com/QQQ0000/p/15557514.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。