序列积第m小元素 二分答案优化

给出两个长度为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开始 从上一次的临界点开始就行

代码

 

猜你喜欢

转载自www.cnblogs.com/akioi/p/12204270.html
今日推荐