H: Dave的组合数组(二分法)
Dave的组合数组
Time Limit: C/C++ 1 s Java/Python 3 s Memory Limit: 128 MB Accepted: 3 Submit: 14
Submit My Status
Problem Description
数组 AA 和数组 BB ,里面都有 nn 个整数。
数组 CC 共有 n2n2 个整数,分别是:
A[0]∗B[0],A[0]∗B[1]......A[0]∗B[n−1]A[0]∗B[0],A[0]∗B[1]......A[0]∗B[n−1]
A[1]∗B[0],A[1]∗B[1]......A[1]∗B[n−1]A[1]∗B[0],A[1]∗B[1]......A[1]∗B[n−1]
............
A[n−1]∗B[0],A[n−1]∗B[1]......A[n−1]∗B[n−1]A[n−1]∗B[0],A[n−1]∗B[1]......A[n−1]∗B[n−1]
是数组 AA 同数组 BB 的组合,求数组 CC 中第 KK 大的数。
例如:
A:123,B:234A:123,B:234。
AA与BB组合成的CC为
A[0]A[0] A[1]A[1] A[2]A[2]
B[0]B[0] 22 33 44
B[1]B[1] 44 66 88
B[2]B[2] 66 99 1212
共9个数。
Input
第1行:22个数NN和KK,中间用空格分隔。NN为数组的长度,KK对应第KK大的数。(2≤N≤50000,1≤K≤109)(2≤N≤50000,1≤K≤109)
第−N+1−N+1行:每行2个数,分别是A[i]和B[i]。(1≤A[i],B[i]≤109)(1≤A[i],B[i]≤109)
Output
输出第K大的数。
Sample Input
3 2
1 2
2 3
3 4
Sample Output
9
分析:对A数列和B数列进行排序,然后二分法找出第k大
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll a[50005],b[50005];
int n;
ll cmd(int x,int y)
{
return x>y;
}
int num(ll mid)
{
int j=1;
//int j=n;
ll ans=0;
for(int i=1;i<=n;i++)
{
while(a[i]*b[j]>mid)//因为a从大到小排序,所以后面的a匹配的个数在前面a匹配个数的基础上加
j++;
ans+=j-1;//当前所有i匹配到的j的个数
// while(j>=0&&a[i]*b[j]>mid)
// j--;
// ans+=n-j;
}
return ans+1;//比它大的有ans个,它是第ans+1大
}
int main()
{
int k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%lld%lld",&a[i],&b[i]);
sort(a+1,a+n+1);//从小到大
sort(b+1,b+n+1,cmd);//从大到小
ll x=a[1]*b[n];//最小
ll y=a[n]*b[1];//最大
//sort(b+1,b+n+1);
// ll x=a[1]*b[1];
// ll y=b[n]*a[n];
while(x!=y)
{
ll mid=x+y>>1;
int kk=num(mid);//找mid是第几大
if(kk<=k)//mid排名比k前,mid在第k大后面
y=mid;
else
x=mid+1;
}
printf("%lld\n",x);
return 0;
}
H: Dave的组合数组(二分法)的更多相关文章
- poj 1743 Musical Theme (后缀数组+二分法)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16162 Accepted: 5577 De ...
- Java之组合数组1
我们先说"数组",数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来唯一地确定数组中的元素. 一.一维数组的定义 type arrayName[]; 其中类型(type ...
- java中的数组二分法
数组二分法意在以较快的速度查找到某个值的下标位置. 二分法的核心思想:找到一个数组的中间位置值,判断某个数值是在这个中间值的左边还是右边,如果是左边,将中间位置之前进行二分,二分后,结束位置变为原始中 ...
- Java中数组二分法查找
算法:当数组的数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序.冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找. 基本思想:假设数据是按升序排序 ...
- SparseArray HashMap 稀疏数组 二分法
简介 HashMap是java里比较常用的一个集合类,我们常用其来缓存一些处理后的结果,但是在Android项目中,Eclipse却给出了一个 performance 警告.意思就是说用SparseA ...
- POJ1743---Musical Theme(+后缀数组二分法)
Description A musical melody is represented as a sequence of N (1<=N<=20000)notes that are int ...
- 2018牛客网暑假ACM多校训练赛(第五场)H subseq 树状数组
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round5-H.html 题目传送门 - https://www.no ...
- ENUMSTXT.H中的指针数组
/************************************************************************ ...
- php 数组二分法查找函数
找到返回对应的key,找不到返回-1,注意二分查找需要数组有序,下边函数需要数组递增排序. function binarySearch($arr,$x){ $start=0; $end=count($ ...
随机推荐
- linux服务器ntp客户端配置【转】
转自:https://www.cnblogs.com/kerrycode/archive/2015/08/20/4744804.html 在Linux系统中,为了避免主机时间因为在长时间运行下所导致的 ...
- 用while实现阶乘
题目描述: 用while语句求1!+2!+3!+...+10! #include<iostream> #include<cstdio> using namespace std; ...
- NO-CARRIER
自己动手写了创建虚拟接口,删除虚拟接口程序,频繁调用创建删除时,有时将接口up起来时会报错: Name not unique on network 利用ip link命令来查看接口(及其对应的索引) ...
- Tomcat 部署项目的三种方法(转)
转自:https://www.cnblogs.com/ysocean/p/6893446.html#_label0 1.下载 Tomcat 服务器 ①.官网下载地址:http://tomcat.apa ...
- python 基础 Two day
1.格式化输出 %s 字符串 %d 数字 %% 转义 % %f 小数 现在有以下需求,让用户输入name, age, job,hobby 然后输出如下所示: ------------ i ...
- Bootstrap -- 模态框实现拖拽移动
### 这里实现这个效果 需要引入 jquery-ui.min.js类库 jquery-ui.min.css样式 使用它提供的draggable()方法实现 ### 菜鸟教程 http://www.r ...
- Linux IO实时监控iostat命令
简介 iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间 ...
- Codeforces 487E Tourists [广义圆方树,树链剖分,线段树]
洛谷 Codeforces 思路 首先要莫名其妙地想到圆方树. 建起圆方树后,令方点的权值是双联通分量中的最小值,那么\((u,v)\)的答案就是路径\((u,v)\)上的最小值. 然而这题还有修改, ...
- linux学习之软件包安装
本学习基于redhat系统或者centos系统 一.软件包的安装 1.rpm安装,rpm安装分为俩种,一种是直接安装xxx.rpm包,另一种是通过yum安装一系列的rpm包. #推荐使用yum安装,y ...
- 弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言
自从 2011 年发布以来,Kotlin 凭借强大的功能在开发者中的欢迎程度与日俱增.且在一年前,Google 宣布 Kotlin 正式成为 Android 官方开发语言,由此引发了从 Java 迁移 ...