第K大的数

来源:互联网 发布:mac休眠后继续下载吗 编辑:程序博客网 时间:2024/04/30 10:06
数组A和数组B,里面都有n个整数。数组C共有n^2个整数,分别是A[0] * B[0],A[0] * B[1] ......A[1] * B[0],A[1] * B[1]......A[n - 1] * B[n - 1](数组A同数组B的组合)。求数组C中第K大的数。
例如:A:1 2 3,B:2 3 4。A与B组合成的C包括2 3 4 4 6 8 6 9 12共9个数。
Input
第1行:2个数N和K,中间用空格分隔。N为数组的长度,K对应第K大的数。(2 <= N <= 50000,1 <= K <= 10^9)第2 - N + 1行:每行2个数,分别是A[i]和B[i]。(1 <= A[i],B[i] <= 10^9)
Output
输出第K大的数。
Input示例
3 21 22 33 4
Output示例

9

#include<cstdio>  #include<iostream>  #include<algorithm>  using namespace std;  typedef long long LL;  const int SIZE = 5e4 + 5;    int n, k;  LL A[SIZE], B[SIZE];    LL check(LL x) {      LL sum = 0;      for (int i = n; i >= 1; i--)     {          int t = lower_bound(B + 1, B + 1 + n, (x - 1) / A[i] + 1) - B;          sum += n - t + 1;          if (sum == 0)         {            break;          }    }      return sum;  }    void fun() {      LL l = 1, r = A[n] * B[n], mid;      while (l <= r)     {          mid = (l + r) >> 1;          if (check(mid) < k)        {            r = mid - 1;          }        else        {            l = mid + 1;          }    }       cout << l-1 << endl;}    int main() {      cin >> n >> k;    for(int i = 1; i <= n; i++)     {          cin >> A[i] >> B[i];    }      sort(A + 1, A + 1 + n);      sort(B + 1, B + 1 + n);      fun();          return 0;  }  


原创粉丝点击