[Codeforces Round #625][Codeforces 1320C/1321E. World of Darkraft: Battle for Azathoth]
题目链接: 1320C - World of Darkraft: Battle for Azathoth / 1321E - World of Darkraft: Battle for Azathoth 题目大意:有\(n\)种剑,每种有对应的攻击值和价格、\(m\)种盾,每种有对应的防御值和价格。以及\(p\)个怪兽,每个怪兽有对应的攻击值、防御值、打败它获得的金币数量。要求购买 恰好 一种剑、一种盾,求打败所有能打败的怪兽后的最大收益(可以为负),其中打败一个怪兽的充要条件是:剑的攻击值 严格 大于怪兽的防御值,且盾的防御值 严格 大于怪兽的攻击值。 题解:考虑枚举在买第\(i\)种剑的前提条件下的最大收益,这时只有防御值小于其攻击力的怪兽才有可能被打败。把这些怪兽放到一个集合内,就相当于有若干个怪兽,求购买一个盾牌的最优解(攻击力小于该盾牌防御值的怪兽的收益和 - 盾牌价格 最大)。 于是我们可以对剑的攻击值排序,这样枚举\(i\)的时候,满足条件的怪兽集合一定是单调上升的。每次将怪兽加入集合后,便可以更新所有防御值大于其攻击值的盾的收益。显然这个可以通过离散化盾的防御值用线段树的区间加以及查询全局最大值来求解,但由于本人实在太弱不怎么会写线段树,不得已使用了分块的做法。不过交上去后发现实际运行时间只有374ms,甚至比一部分的线段树做法跑得还快,故拿出来分享一下_(