Gym 101064 D Black Hills golden jewels (二分)

题目链接:http://codeforces.com/gym/101064/problem/D

问你两个数组合相加的第k大数是多少。

先sort数组,二分答案,然后判断其正确性(判断过程是枚举每个数然后二分)。

 1 //#pragma comment(linker, "/STACK:102400000, 102400000")
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <vector>
 8 #include <cmath>
 9 #include <ctime>
10 #include <list>
11 #include <set>
12 #include <map>
13 using namespace std;
14 typedef long long LL;
15 typedef pair <int, int> P;
16 const int N = 1e5 + 5;
17 LL a[N], k, n;
18 
19 bool judge(LL val) {
20     LL cnt = 0;
21     for(int i = 1; i <= n; ++i) {
22         LL pos = (LL)(upper_bound(a + 1, a + n + 1, val - a[i]) - a);
23         if(pos > (LL)i)
24             cnt += n - pos + 1;
25         else
26             cnt += n - pos;
27     }
28     cnt /= 2;
29     return (n - 1)*n/2 - k >= cnt;
30 }
31 
32 int main()
33 {
34     while(~scanf("%lld %lld", &n, &k)) {
35         for(int i = 1; i <= n; ++i) {
36             scanf("%lld", a + i);
37         }
38         sort(a + 1, a + n + 1);
39         LL l = a[1] + a[2], r = a[n] + a[n - 1];
40         while(l < r) {
41             LL mid = (l + r) / 2;
42             if(judge(mid)) {
43                 r = mid;
44             } else {
45                 l = mid + 1;
46             }
47         }
48         printf("%lld\n", l);
49     }
50     return 0;
51 }

 

posted @ 2016-09-09 20:32  Recoder  阅读(316)  评论(0编辑  收藏  举报