51nod 1105 二分好题

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105

1105 第K大的数

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

收藏

关注

数组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 2
1 2
2 3
3 4

Output示例

9  好巧妙的二分套二分啊,套路啊= =  我们可以对这个数的大小进行二分,判断一下小于等于这个mid的有多少个数,有多少个数不就说明这个数排第几吗,只要找到一个mid小于等于他的数==k就说明这是第K小的数,题目的第K大也就是第N*N-K+1小,在统计小于等于mid的数的个数时,也要用二分,我们可以先对AB排序然后枚举每一个Ai,二分查找最多能匹配多少个Bj,累加即可。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 #define LL long long
 7 LL inf = (LL)1e18+5;
 8 LL A[50005], B[50005];
 9 LL cal(LL K,LL N )
10 {
11     LL r = 0;
12     for (int i = 1;i <= N;++i)
13     {
14         LL x = K / A[i];
15         if (x < B[1])continue;
16         LL k = upper_bound(B + 1, B + 2 + N, x) - B;
17         r += k - 1;
18     }
19     return r;
20 }
21 int main()
22 {
23     LL N, K, i;
24     cin >> N >> K;
25     for (i = 1;i <= N;++i)scanf("%lld%lld", A + i, B + i);
26     sort(A + 1, A + N + 1);
27     sort(B + 1, B + 1 + N);
28     A[N + 1] = B[N + 1] = inf;
29     A[0] = B[0] = -1;
30     LL l = 1,r = 1e18;
31     K = N*N - K + 1;
32     while (l < r) {
33         LL mid = l + (r - l) / 2;
34             if (cal(mid,N) < K) l = mid + 1;
35             else r = mid;   //为了防止答案是mid但是有许多重复的导致cal返回值大于k,我们在这里让r=mid仍然使得mid可以被查找到,而不是被忽略
36     }
37     printf("%lld\n", l);
38     return 0;
39 }
时间: 2024-07-28 19:43:10

51nod 1105 二分好题的相关文章

ACdreamoj(1105)模拟题

题意:射一次激光最多可以攻击到几个敌人(由于激光很强大,可以在击中敌人后穿过它,而瑶瑶自己的坦克由于有特殊装置,所以不会被激光击中,激光也会直接穿过它) . 表示此处为空地 * 表示此处为障碍(激光不可穿过,激光路径打到障碍时就结束) T代表瑶瑶的坦克位置 E代表敌人 / 代表按 左下-右上 放置的镜子 \ 代表按 左上-右下 放置的镜子 解法:模拟题.由于位置过多.所以不能用递归模拟,要注意环的判断,还有射击过的敌人要打上标记.wa了n发,最后发现是=写成了==,真的很不应该. 代码: /**

Honk&#39;s pool(二分模板题)

题意:有n个水池,每个水池有a[i]单位水,有k次操作,每次操作将水量最多的水池减少一单位水,水量最少的水池增加一单位水,问最后水量最大的水池和水量最少的水池相差的水量. 思路:二分最后的最大水量和最小水量,特别的,模拟一下可以发现如果总水量sum%n==0,则最大值的下界和最小值的上界均为sum/n,若sum%n!=0,则最大值的下界为sum/n+1,最小值上界为sum/n.二分时注意选取区间是左闭右开还是左开右闭. #include <iostream> #include <algo

51nod 1243 二分+贪心

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 1243 排船的问题 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个码头中有N艘船和N个木桩,船的长度为2*X,码头的宽度为M,N个木桩的位置(相对码头左岸的位置)会在数据中给出.船和船之间不能重叠,即每艘船的船头不能超过上一艘船的船尾,当然也不能超出码头的两岸.船和木桩之间用绳子

51nod 1128 二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1128 1128 正整数分组 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 给出一个长度为N的正整数数组,不改变数组元素的顺序,将这N个数分为K组.各组中元素的和分别为S1,S2....Sk.如何分组,使得S1至Sk中的最大值最小? 例如:1 2 3 4 5 6分为3组,{1 2 3} {4 5} {6},元素和为6

51nod 1267 二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267 1267 4个数和为0 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 <= N <= 1000) 第2 - N + 1行:

51nod 1105 第K大的数

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 数组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,中间用

51nod 1267二分+优化试验场

最初,最开始的时候,万能的学姐曾经警告过我们,千万别用什么老狮子MAP,手撸map或者字典树...当时不甚理解...今天...这题直接卡掉了我的MAP,但是使用朴素方法进行二分...不加优化,,都不需要这个架势...直接相差了将近十倍,在我开了优化之后快了20倍左右.... 上代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const long long MAXN=1233; 5 6 7 class node 8 { 9 pub

【ECNU3542】神奇的魔术(二分交互题)

点此看题面 大致题意: 有一个\(1\sim 2^n\)的排列,\(n\le7\),每次交互告诉你有几个位置上的数是正确的,让你在\(1000\)轮以内猜出每个位置上的数. 二分 显然,我们可以通过二分来求解此题. 具体地,我们先把所有位置填满\(1\),然后暴力枚,找到一个位置填上\(2\)使得此时没有一个位置上的数是正确的. 然后接下来,我们枚举\(3\sim2^n\)的每一个数,每次把\(l\sim mid\)这段区间内除不是\(1\)或\(2\)的位置外全填上当前数,然后询问当前对的数的

BZOJ-1305: [CQOI2009]dance跳舞(最大流 增加超级源汇+分裂点+二分 水题)

1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MB Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞.给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲? Inpu