0%

CF2132E Arithmetics Competition

题意简述

在算术竞赛中,参赛者需要从手中的卡片中获得尽可能高的总和。队伍 “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’$ 迭代到一个较小的范围,再去遍历。