……没有样例和数据范围吗?
我觉得这道题不是提速不提速的问题,因为暴力做法的时间复杂度就是 O(nlogn) (排序),已经足够快了。
如果假定 a[i] >= 0, b[i] >= 1,那么我可以提供一种思路。
首先,为了得到尽可能大的结果,显然我们需要对两个输入数组进行降序排序,从大到小选择元素,也就是取这两个数组的前缀。我们总共需要取 k 个元素,所以这两段前缀的长度之和为 k。
然后考虑暴力做法,即枚举 k + 1 种可能性找最大值。
显然,我们并不能直接把当前结果计算出来,因为它可能会非常大,以至于 long long 甚至 __int128 都无法存储(不考虑使用高精度)。这就是本题的难点——如何在不直接计算出结果的前提下,比较当前结果和其他结果的大小呢?
假设我们当前在数组 a 取了长度为 t 的前缀,那么相应地就需要在数组 b 取长度为 k - t 的前缀。那么,当前结果的表达式为:……(见下图)
如果我们在数组 a 取长度为 t+1 的前缀呢?
记这两次结果分别为 A_t 和 A_{t+1}:

为了比大小,作差:

因为我们的目的是比大小,所以关注结果的符号,显然符号只和右边的部分有关:

注意数组 a, b 已经过降序排序,有:

当 t > 0 时,若 b_{k-t} = 1,则符号就是 a_{t+1} 的符号,而 a_{t+1} >= 0,所以此时 A_{t+1} >= A_t;若 b_{k-t} >= 2,则 A_{t+1} <= A_t (简单的放缩可得)。
当 t = 0 时,上式等于:

我们发现,如果 b_k = 1,则 A_1 >= A_0。
想象 b 数组,它类似 ..3, 3, 2, 2, 1, ...,1, 1,根据前面的分析,当 t > 0 且 b_{k-t} 为 1 时,始终有 A_{t+1} >= A_t,且 A_1 >= A_0。如果记最大的 t = t0,使得 b_{k-t} = 1,则对于所有的 0 <= t <= t0,都有 A_{t+1} >= A_t 成立!此时数列 {A_t} 是不下降的,因此最大值就是 A_t0。
如果 b_k >= 2 呢?因为 b 数组是降序排序的,所以此时 b 数组的所有元素都大于等于 2。根据前面的分析,当 t > 0 时,都有 A_{t+1} <= A_t,此时数列 {A_t} 是不上升的,因此最大值就是 max(A_0, A_1)。
所以,我们需要算出 A_0,A_1 然后比大小吗?不用。
还记得上面这张图吗?

我们可以代入 b_k,a_1 和 x,就能知道 A_0 和 A_1 谁更大。(这应该不太可能溢出吧)