• a problem


    给出两个长度为 $n$ 的数组 $a, b$
    对于任意的 $a_i + b_j$, 求第 $k$ 大

    不妨设 $a_i < a_{i + 1}, b_i < b_{i + 1}$

    对于任意的 $a_i + b_j$, 可以得到这样的 $n ^ 2$ 个数

    $$
    egin{matrix}
    a_1 + b_1 & a_1 + b_2 & cdots & a_1 + b_n \
    a_2 + b_1 & a_2 + b_2 & cdots & a_2 + b_n \
    vdots & vdots & ddots & vdots \
    a_n + b_1 & a_n + b_2 & cdots & a_n + b_n \
    end{matrix}
    $$

    显然最小的数一定在第一列中
    可以用一个 pair 存储矩阵中的每个元素
    pair <a_i + b_j, j>
    这样的话可以由改元素推出同行下列的元素
    $first = a_i + b_j - b_j + b_{j + 1}$
    $second = j + 1$

    首先将第一列的元素对应的 pair 放入 priority_queue
    每次弹出 fisrt 最小的元素,放入该元素的同行的下列元素

    直至找到 $k$ 大

    时间复杂度 O(nlogn)

  • 相关阅读:
    Java循环结构
    Java正则表达式
    Java日期时间
    Java如何输入数据
    Java数组
    Java StringBuffer和StringBuilder类
    Java String类
    Java Character类
    Java Number&Math类
    python之二维码生成
  • 原文地址:https://www.cnblogs.com/shandongs1/p/9664842.html
Copyright © 2020-2023  润新知