zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    Web安全
    前端安全之XSS攻击
    SQL盲注
    Vim使用手册
    VC获取cookies的几种方法
    Wireshark基本介绍和学习TCP三次握手
    细说Cookie
    top100tools
    如何更改Jframe里Jpanel的大小
    HTTP&&Fiddler教程
  • 原文地址:https://www.cnblogs.com/shandongs1/p/9664842.html
Copyright © 2011-2022 走看看