题意简述
在算术竞赛中,参赛者需要从手中的卡片中获得尽可能高的总和。队伍 “fst_ezik” 中,Vadim 有 $n$ 张写有数字 $a_i$ 的卡片,Kostya 有 $m$ 张写有数字 $b_i$ 的卡片。在每个共计 $q$ 个回合里,他们都想获胜,但这一次比赛规则与通常略有不同。
在每个回合中,参赛者会被给出三个数字 $x_i$、$y_i$ 和 $z_i$。队伍 “fst_ezik” 必须从他们所有的卡片中恰好选择 $z_i$ 张,其中 Vadim 从自己的集合中最多可选 $x_i$ 张,Kostya 从自己的集合中最多可选 $y_i$ 张。请帮助他们为每个回合求出可以达到的最大总和。
思路分析
其实这题本来不值得单独记一下的。但又犯唐了。记一下。
很容易想到先排序,然后依次找两个集合中较大的加进去(满足数量限制即可)。
但是会超时。
实际上,最后答案一定是由 $A$ 序列里面最大的前 $x’$ 个数和 $B$ 序列里面最大的前 $y’$ 个数加到一起得到的。
这一步可以通过前缀和得到。
如果确定了取 $A$ 的前 $x’$ 个数,那么就知道 $y’=z-x’$。
所以说问题来到如何确定 $x’$。
又知道 $x’ \in [\max(0, z-y_i), \min(x_i, z)]$,且对应的最大和是一个单峰函数。
所以可以三分法把 $x’$ 迭代到一个较小的范围,再去遍历。