基准时间限制:1 秒 空间限制:131072 KB 
数组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. 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
    思路:二分,先排序,首先二分答案,答案的范围在ans[0]*bns[0]---ans[n-1]*bns[n-1]之间,然后二分统计这个答案的前面是否有大于等于k个比他大的,符合的话并且二分检查这个答案是否存在。
  1. 1 #include<stdio.h>
  2. 2 #include<algorithm>
  3. 3 #include<iostream>
  4. 4 #include<string.h>
  5. 5 #include<queue>
  6. 6 #include<math.h>
  7. 7 #include<set>
  8. 8 #include<vector>
  9. 9 #include<string.h>
  10. 10 using namespace std;
  11. 11 typedef long long LL;
  12. 12 typedef struct node {
  13. 13 LL x;
  14. 14 LL y;
  15. 15 } ss;
  16. 16 LL ans[60000];
  17. 17 LL bns[60000];
  18. 18 bool check(LL n,LL N,LL M) {
  19. 19 int i,j;
  20. 20 LL cnt = 0;
  21. 21 for(i = 0; i < N; i++) {
  22. 22 int l = 0;
  23. 23 int r =N;
  24. 24 int id = -1;
  25. 25 while(l<=r) {
  26. 26 int mid = (l+r)/2;
  27. 27 if(bns[mid]*ans[i]>=n) {
  28. 28 id = mid;
  29. 29 r = mid - 1;
  30. 30 } else l= mid + 1;
  31. 31 }
  32. 32 if(id!=-1) {
  33. 33 if(n==12)printf("%d\n",id);
  34. 34 cnt += N-id;
  35. 35 }
  36. 36 }
  37. 37 if(cnt>=M)return true;
  38. 38 return false ;
  39. 39 }
  40. 40 bool er(int n,int m,int ask);
  41. 41 bool test(LL mid,LL N,LL M);
  42. 42 int main(void) {
  43. 43 LL N,M;
  44. 44 scanf("%lld %lld",&N,&M);
  45. 45 int i,j;
  46. 46 for(i = 0; i < N; i++) {
  47. 47 scanf("%lld %lld",&ans[i],&bns[i]);
  48. 48 }
  49. 49 sort(ans,ans+N);
  50. 50 sort(bns,bns+N);
  51. 51 LL ak = ans[0]*bns[0];
  52. 52 LL bk = ans[N-1]*bns[N-1];
  53. 53 LL all = -1;//printf("%lld %lld\n",ak,bk);
  54. 54 while(ak<=bk) {
  55. 55 LL mid = (ak+bk)/2;
  56. 56 if(check(mid,N,M)) {
  57. 57 if(test(mid,N,M))
  58. 58 all = max(mid,all);
  59. 59 ak = mid + 1;
  60. 60 } else bk = mid-1;
  61. 61 }
  62. 62 printf("%lld\n",all);
  63. 63 return 0;
  64. 64 }
  65. 65 bool test(LL mid,LL N,LL M) {
  66. 66 int i,j;
  67. 67 LL kk;
  68. 68 for(i = 0; i < N; i++) {
  69. 69 if(mid%ans[i]==0) {
  70. 70 if(er(0,N,mid/ans[i]))
  71. 71 return true;
  72. 72 }
  73. 73 }
  74. 74 }
  75. 75 bool er(int n,int m,int ask) {
  76. 76 if(n>m)return false;
  77. 77 int mid = (n+m)/2;
  78. 78 if(bns[mid]==ask) {
  79. 79 return true;
  80. 80 } else if(bns[mid]>ask) {
  81. 81 return er(n,mid-1,ask);
  82. 82 } else return er(mid+1,m,ask);
  83. 83 }

复杂度N*log(N);

  1.  

1105 第K大的数的更多相关文章

  1. 51 nod 1105 第K大的数

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

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

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

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

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

  4. 51NOD 1105 第K大的数

    数组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 ...

  5. AC日记——第K大的数 51nod 1105

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

  6. 51nod 1105:第K大的数

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

  7. [51NOD1105]第k大的数(二分答案)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105 先排序,二分上下界分别是最小的两个数和最大的两个数的乘积 ...

  8. POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)

    传送门 The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8690   Acce ...

  9. 51nod p1175 区间中第K大的数

    1175 区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有 ...

随机推荐

  1. LATEX公式语法

    see how any formula was written in any question or answer, including this one, right-click on the ex ...

  2. mac系统升级导致VirtualBox报Kernel driver not installed (rc=-1908)

    一.背景 最近将我的Mac升级成了Monterey版本,结果发现之前的安装的VirtualBox虚拟机无法启动,报了如下错误. Kernel driver not installed (rc=-190 ...

  3. C#多个标题头合并

    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { switch (e.Row.RowType) ...

  4. 1005.K次取反后最大化的数组和

    1005.K次取反后最大化的数组和 目录 1005.K次取反后最大化的数组和 题目 题解 排序+维护最小值min 题目 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 ...

  5. mongDB进阶

    Mongo进阶 聚合 聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果. 文档进入多阶段管道,将文档转换为聚合结果 聚合管道 例子: 第一阶段:过滤,$match 第 ...

  6. windows Notepad++ 上配置 vs 编译器 , 编译并运行

    windows 中 配置 vs编译器 在Linux下,Kris是倾向于在终端中使用gcc和g++来编译C/C++的,在Windows下相信很多人都是选择臃肿的Visual Studio,我亦不免如此. ...

  7. android Paint 详解

    /**     * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体 ...

  8. 【Linux】【Services】【SaaS】Docker+kubernetes(5. 安装和配置ETCD集群)

    1. 简介: 1.1. ETCD是kubernetes和openstack都用到的组件,需要首先装好 1.2. 官方网站:https://coreos.com/etcd/ 1.3. ETCD的作用: ...

  9. 二级C复习

    二级C语言 队列 计算队列中元素个数 种 : rear > front ,直接减 第二种: rear < front 上面两种综合一起,求元素个数公式 :(r - f + maxsize) ...

  10. 可扩展标记语言XML(淅淅沥沥的小雨)

    XML简述 XML用于描述数据,是当前处理结构化文档信息的有力工具.与操作系统编程语言的开发平台无关,可以实现不同系统之间的数据交互. xml文件结构: 1 <?xml version=&quo ...