题目链接:http://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=620811

参考自:https://blog.csdn.net/f_zyj/article/details/51990962

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
数组A和数组B,里面都有n个整数。

数组C共有n^2个整数,分别是:

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[n - 1] * B[0],A[n - 1] * B[1]  ......  A[n - 1] * B[n - 1]
是数组A同数组B的组合,求数组C中第K大的数。
 
例如:
A:1 2 3,B:2 3 4。
A与B组合成的C为
         A[0]  A[1]  A[2]
B[0]     2      3      4
B[1]     4      6      8
B[2]     6      9     12
共9个数。
Input
  1. 1行:2个数NK,中间用空格分隔。N为数组的长度,K对应第K大的数。(2 <= N <= 500001 <= K <= 10^9)
  2. 2 - N + 1行:每行2个数,分别是A[i]和B[i]。(1 <= A[i],B[i] <= 10^9)
Output
  1. 输出第K大的数。
Input示例
  1. 3 2
  2. 1 2
  3. 2 3
  4. 3 4
Output示例
  1. 9
  2.  
  3. 解题思路:总共有n*n个数,要查找第K大数,即查找第n*n+k-1小数,先对两个数组进行排序,对该区间范围进行二分,然后判断比该数小的数数目是比n*n+k-1多还是少。
    附上代码
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll maxn=5e4+;
  5. ll n,k,A[maxn],B[maxn];
  6.  
  7. ll check(ll x)
  8. {
  9. ll j=n,cnt=;
  10. for(int i=;i<=n;i++)
  11. {
  12. while(j>)
  13. {
  14. if(A[i]*B[j]>x)
  15. j--;
  16. else
  17. break;
  18. }
  19. cnt+=j;
  20. }
  21. return cnt;
  22. }
  23.  
  24. int main()
  25. {
  26. scanf("%lld%lld",&n,&k);
  27. for(int i=;i<=n;i++)
  28. scanf("%lld%lld",&A[i],&B[i]);
  29. sort(A+,A+n+);
  30. sort(B+,B++n);
  31. ll low=A[]*B[];
  32. k=n*n-k+;
  33. ll high=A[n]*B[n];
  34. while(low<=high)
  35. {
  36. ll mid=(low+high)>>;
  37. if(check(mid)>=k)
  38. high=mid-;
  39. else
  40. low=mid+;
  41. }
  42. printf("%lld\n",low);
  43. }

51nod 1105(第K大数 二分套二分)的更多相关文章

  1. POJ-3579 Median---二分第k大(二分套二分)

    题目链接: https://cn.vjudge.net/problem/POJ-3579 题目大意: 求的是一列数所有相互之间差值的序列的最中间的值是多少. 解题思路: 可以用二分套二分的方法求解第m ...

  2. poj3579 二分套二分

    和poj3685类似,都是二分答案然后在判断时再二分 这题的内层二分可以用stl代替 /* 二分套二分,思路:升序排序数据,先二分答案x进行判断,判断时枚举每个元素,二分找到和其之差小于等于x的所有值 ...

  3. poj 3579 Median 二分套二分 或 二分加尺取

    Median Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5118   Accepted: 1641 Descriptio ...

  4. poj 3685 Matrix 二分套二分 经典题型

    Matrix Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 5724   Accepted: 1606 Descriptio ...

  5. 51nod 1105 第K大的数 【双重二分/二分套二分/两数组任意乘积后第K大数】

    1105 第K大的数  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ...

  6. 【BZOJ-3110】K大数查询 整体二分 + 线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6265  Solved: 2060[Submit][Sta ...

  7. BZOJ 3110 K大数查询 | 整体二分

    BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...

  8. 1105 第K大的数(二分)

    1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * B[0],A[0 ...

  9. [ZJJOI2013]K大数查询 整体二分

    [ZJJOI2013]K大数查询 链接 luogu 思路 整体二分. 代码 #include <bits/stdc++.h> #define ll long long using name ...

随机推荐

  1. css太极

    自己用css做的太极,留个纪念. 用css做太极有很多种实现方法,我这种大概是最简单的了吧,因为div用得太多了,哈哈. 高级一点的应该是用伪类:before和:after去减少div的用量(手动滑稽 ...

  2. [转帖]ODBC、OLEDB、ADO、ADO.NET

    一文详解ODBC.OLEDB.ADO.ADO.NET之间的关系 2019年01月16日 21:28:38 LoveMIss-Y 阅读数:66更多 所属专栏: 白话C#高级编程   版权声明:本文为博主 ...

  3. 爱上linux 简单实现移动办公处理环境.

    1. 这周一直在鼓捣linux上面的环境测试. 简单的将 我们的产品部署到了linux上面 详情见前面的 blog 2. 有时候下班了 或者是 在WC (科技园wc排队 说多了都是泪) 或者是眼睛不舒 ...

  4. git fetch 和git pull 的差别

    1.git fetch 相当于是从远程获取最新到本地,不会自动merge,如下指令: git fetch orgin master //将远程仓库的master分支下载到本地当前branch中 git ...

  5. Day 5-7 exec 和元类的创建.

    exec方法 元类 exec(str_command,globals,locals)参数1:字符串形式的命令参数2:全局作用域(字典形式). 如果不指定,默认globals参数3:局部作用(字典形式) ...

  6. C# Note29: Close()和Dispose()的区别

    待更! 深入解析Close()和Dispose()的区别

  7. eclipse 编码

    单个修改 右击 选择properties  

  8. 国内的go get问题的解决

    在国内采用go get有时会下载不到一些网站如golang.org的依赖包. 方法1(亲测有效): gopm 代替go 下载第三方依赖包可以采用gopm从golang.org一些镜像网站上下载. 注意 ...

  9. DTW的原理及matlab实现

    参考: https://www.cnblogs.com/Daringoo/p/4095508.html

  10. Ubuntu中MySql的启动与关闭

    安装mysql sudo apt-get install mysql-server sudo apt install mysql-client sudo apt install libmysqlcli ...