51Nod

数组A和数组B,里面都有n个整数。数组C共有n^2个整数,分别是A00 * B00,A00 * B11......A11 * B00,A11 * B11......An1n−1 * Bn1n−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个数,分别是Aii和Bii。(1 <= Aii,Bii <= 10^9)Output输出第K大的数。Sample Input

3 2
1 2
2 3
3 4

Sample Output

9
二分查找 很好的思维题
 1 #include <iostream>
 2 using namespace std;
 3 #include<string.h>
 4 #include<set>
 5 #include<stdio.h>
 6 #include<math.h>
 7 #include<queue>
 8 #include<map>
 9 #include<algorithm>
10 #include<cstdio>
11 #include<cmath>
12 #include<cstring>
13 #include <cstdio>
14 #include <cstdlib>
15 #include<stack>
16 #include<vector>
17 long long  n,m;
18 long long a[510000];
19 long long b[510000];
20 long long  zhaogeshu(long long  zhi)
21 {
22 
23     long long  j=n;
24     long long  sum=0;
25     for(int i=1;i<=n;i++)
26     {
27         while(j>0)
28         {
29             if(a[i]*b[j]>zhi)
30                 j--;
31             else
32                 break;
33         }
34         sum+=j;
35     }
36     return sum;
37 }
38 int main()
39 {
40     cin>>n>>m;
41     memset(a,0,sizeof(a));
42     memset(b,0,sizeof(b));
43     for(int i=1;i<=n;i++)
44         scanf("%lld %lld",&a[i],&b[i]);
45     sort(a+1,a+1+n);
46     sort(b+1,b+1+n);
47     long long kaishi=a[1]*b[1];
48     long long jieshu=a[n]*b[n];
49     long long  weizhi=n*n-m+1;
50     long long mid;
51     long long t=0;
52     while(kaishi<jieshu-1)
53     {
54         mid=(kaishi+jieshu)/2;
55         if(zhaogeshu(mid)>=weizhi)
56             {
57                 jieshu=mid;
58                 t=mid;
59             }
60         else
61             kaishi=mid;
62     }
63     cout<<t<<endl;
64     return 0;
65 }
View Code
原文地址:https://www.cnblogs.com/dulute/p/7966709.html