zoukankan      html  css  js  c++  java
  • 序列积第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开始 从上一次的临界点开始就行

    代码

     

  • 相关阅读:
    ConcurrentSkipListMap 源码分析
    ConcurrentHashMap 源码分析
    CopyOnWriteArrayList 源码分析
    AtomicBoolean 源码分析
    commons-lang3-3.4.jar
    Effective Java
    FindBugs Bug Descriptions
    EasyMock
    Apache Maven 入门
    Eclipse
  • 原文地址:https://www.cnblogs.com/akioi/p/12204270.html
Copyright © 2011-2022 走看看