给出两个长度为n的数组A和B, 在A和B中各任取一个, 可以得到n×n个积. 求第m小的元素。 n<=100000
这一道题的意思就是
a1 a2 a3 a4..
b1 b2 b3 b4
n^2个乘积 我们只需要求第m小的乘积
简单粗暴的办法就是用二分答案
我们知道 这m个乘积 肯定是a前面的一段 对应b前面的一段
我们假设这个第m小的乘积为x
ai*bj<=x
ai<=x/bj
也就是说我们可以用二分答案logM的时间复杂度枚举x
再用On的时间复杂度枚举bj
然后把a从小到大排序 二分答案 这又要logn
这样一来必超时
我们可以考虑优化 我们发现枚举bj的那个地方耗时太多了 可以优化一下
因为随着i不断增大 j会不断减小
我们就可以不使用二分了
我们只需要找到一个临界点 这个临界点之前的b都是合法的 就不必再走
而且每一次的临界点都比上一次的临界点靠前
所以临界点也不必从n开始 从上一次的临界点开始就行
代码