ACM_求第k大元素(两次二分)
求第k大
Time Limit: 6000/3000ms (Java/Others)
Problem Description:
给定两个数组A和B,大小为N,M,每次从两个数组各取一个数相乘放入数组C,最终得到一个N*M的数组C。求C中第K大的数。
Input:
输入包含多组测试数据,每组数据首先输入两个整数N,M,K,接下来一行有N个整数Ai,再接下来一行有M个整数Bi。(1≤N,M≤10^5,1≤Ai,Bi≤10^5,1≤K≤N*M)
Output:
对于每组数据,输出答案。
Sample Input:
3 2 2
1 2 3
1 2 2 2 1
1 1
1 1
Sample Output:
4
1
解题思路:由于数据非常大,因此考虑二分来做:先对两个数组降序排,然后外层二分查找第k大元素,内层二分查找当前mid在数组C中排第几并作为外层二分查找的条件,最终的答案就是l-1,详解看代码。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e5+;
int n,m;LL k,l,r,mid,ans,A[maxn],B[maxn];
inline LL read(){
LL x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void print(LL x){
if(x<)putchar('-'),x=-x;
if(x>)print(x/);
putchar(x%+'');
}
bool check(LL mid){
LL cnt=;
for(int i=;i<n;++i){
int lt=,rt=m-;
while(lt<=rt){///二分找b数组中某个元素与当前A[i]乘积不小于mid的最大下标lt-1
int midt=(lt+rt)>>;
if(A[i]*B[midt]>=mid)lt=midt+;///说明可能还有更小的元素与A[i]相乘之后不小于mid,则往右边找
else rt=midt-;///否则往左边找
}
cnt+=lt;///退出条件是rt=lt-1,而下标是0开始的,所以lt不用减1,累加当前满足条件的个数
}
return cnt>=k;
}
int main(){///时间复杂度为log2(nm)*n*log2(m)
while(~scanf("%d%d%lld",&n,&m,&k)){
for(int i=;i<n;++i)A[i]=read();
for(int i=;i<m;++i)B[i]=read();
sort(A,A+n,greater<LL>());///降序排
sort(B,B+m,greater<LL>());
l=A[n-]*B[m-],r=A[]*B[];
while(l<=r){///二分找第k大元素(即两个数的乘积)
mid=(l+r)>>;
if(check(mid))l=mid+;///说明mid可以更大,继续往右边找
else r=mid-;///否则往左边找
}
print(l-);puts("");
}
return ;
}
ACM_求第k大元素(两次二分)的更多相关文章
- 算法导论学习之线性时间求第k小元素+堆思想求前k大元素
对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...
- 堆实战(动态数据流求top k大元素,动态数据流求中位数)
动态数据集合中求top k大元素 第1大,第2大 ...第k大 k是这群体里最小的 所以要建立个小顶堆 只需要维护一个大小为k的小顶堆 即可 当来的元素(newCome)> 堆顶元素(small ...
- 面试题:求第K大元素(topK)?
一.引言二.普通算法算法A:算法B:三.较好算法算法C:算法D:四.总结 一.引言 这就是类似求Top(K)问题,什么意思呢?怎么在无序数组中找到第几(K)大元素?我们这里不考虑海量数据,能装入内 ...
- 行列有序矩阵求第k大元素
问题来源:http://www.careercup.com/question?id=6335704 问题描述: Given a N*N Matrix. All rows are sorted, and ...
- POJ 2985 Treap平衡树(求第k大的元素)
这题也能够用树状数组做,并且树状数组姿势更加优美.代码更加少,只是这个Treap树就是求第K大元素的专家--所以速度比較快. 这个也是从那本红书上拿的模板--自己找了资料百度了好久,才理解这个Trea ...
- 寻找两个已序数组中的第k大元素
寻找两个已序数组中的第k大元素 1.问题描述 给定两个数组与,其大小分别为.,假定它们都是已按照增序排序的数组,我们用尽可能快的方法去求两个数组合并后第大的元素,其中,.例如,对于数组,.我们记第大的 ...
- 【转载】两个排序数组的中位数 / 第K大元素(Median of Two Sorted Arrays)
转自 http://blog.csdn.net/zxzxy1988/article/details/8587244 给定两个已经排序好的数组(可能为空),找到两者所有元素中第k大的元素.另外一种更加具 ...
- Coursera Algorithms week3 快速排序 练习测验: Selection in two sorted arrays(从两个有序数组中寻找第K大元素)
题目原文 Selection in two sorted arrays. Given two sorted arrays a[] and b[], of sizes n1 and n2, respec ...
- 如何寻找无序数组中的第K大元素?
如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素.比如给定的无序数组如下所示: 如果k=6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24,第二 ...
随机推荐
- 苹果应用内支付(iOS IAP)的流程与常用攻击方式
1. 客户端直接verify苹果的receipt 如果verify成功 自行发放商品 2. 客户端将receipt传给server,由server进行验证并发放商品 按照安全性原则, 客户端的所有信息 ...
- 前端模块化开发的规范:AMD与CDM
AMD, 异步模块定义. CMD,通用模块规范.
- HDU1300 Pearls —— 斜率优化DP
题目链接:https://vjudge.net/problem/HDU-1300 Pearls Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- codeforces 440B. Balancer 解题报告
题目链接:http://codeforces.com/problemset/problem/440/B 题目意思:给出 n 个数,求出这 n 个数的平均值avg,问对于这 n 个数里面中的每一个数,要 ...
- oracle:通过shell来运行rman命令
每次都手工输入一批rman命令来进行备份等操作是很繁琐的事,有什么简便的方法吗?可以的,你可以把这批rman命令写在 shell命令里面,需要的时候,运行一下sh即可.下面是一个简单的实例: RMAN ...
- re(正则表达式)模块
一.最常用的匹配语法 re.match 从头开始匹配 re.search 匹配包含 re.findall 把所有匹配到的字符放到以列表中的元素返回 re.split 以匹配到的字符当做列表分隔符 r ...
- 1Q84 BOOK 1-3 笔记
1Q84 BOOK 1-3 村上春树 18个笔记 ◆ 第2章 青豆 不要被外表迷惑 >> 在这三十年的人生中,究竟听过多少次同样的台词?为了这个姓氏,曾经多少次遭人调侃?如果不 ...
- 各种java生成word解决方案的优缺点对比
解决方案 优点 缺点 Jacob 功能强大 直接调用VBA接口,程序异常复杂:服务器必须是:windows系统+安装Office:服务器端自动化com接口容易产生死进程造成服务器宕机 Apache P ...
- UIScrollView控件介绍
1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 (2)当展⽰示的内容较多,超出⼀一个屏幕时,⽤用户可通过滚动⼿手势来查看 ...
- 【AC自动机&&Trie图】积累
以前KMP和后缀系列(主要是后缀数组,后缀自动机),都刷了一定数量的题,但是对于AC自动机,却有些冷落,罪过. 但是我感觉,在蓝桥杯比赛中AC自动机出现的概率比后缀系列大,简单的会考匹配,稍难一点会考 ...