博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
两个数组各个数相加或相乘变成一个矩阵求第K大
阅读量:4327 次
发布时间:2019-06-06

本文共 1863 字,大约阅读时间需要 6 分钟。

input

1<=T<=20

1<=n<=100000,1<=k<=n*n

a1 a2 ... an 0<ai<=10000

b1 b2 ... bn 0<bi<=10000

output

第k大的数(包含重复)

做法:类似字符串的编码解码,这里是解码过程,将k解码为对应的01串,把第K大的数看成一个01串,统计出比1000000000000000000000000000000000大的数有多少个,从而确定第一个数是0还是1,然后第二位也是这样,不断的重复直到找到第K大的数,复杂度为O(2nlog(maxa*maxb))

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[i]*b[j]>val时,a[i+1]*b[j]>val

1 #include 
2 #include
3 #include
4 using namespace std; 5 typedef long long LL; 6 7 const int MAXN = 100010; 8 9 int a[MAXN], b[MAXN];10 int T, n;11 LL k;12 13 bool check(int val)//统计比val小的数的个数cnt,看cnt比k大还是比k小14 {15 LL cnt = 0;16 for(int i = 0, j = n - 1; i < n; ++i)17 {18 while(j >= 0 && a[i] * b[j] > val) --j;19 cnt += j + 1;//j+1指每一列数中比val大的数20 }21 return cnt >= k;22 }23 24 int solve()//二分查找第k大的数25 {26 int l = a[0] * b[0], r = a[n - 1] * b[n - 1];27 while(l < r)28 {29 int mid = (l + r) >> 1;30 if(!check(mid)) l = mid + 1;31 else r = mid;32 }33 return l;34 }35 36 int main()37 {38 scanf("%d", &T);39 while (T--)40 {41 scanf("%d%I64d", &n, &k);42 for(int i = 0; i < n; ++i) scanf("%d", &a[i]);43 for(int i = 0; i < n; ++i) scanf("%d", &b[i]);44 sort(a, a + n);45 sort(b, b + n);46 k = (LL)n * n - k + 1;47 printf("%d\n", solve());48 }49 return 0;50 }
View Code

input

1<=T<=10

1<=n,k<=100000

a1 a2 ... an an<=10^9

b1 b2 ... bn bn<=10^9

output

第k小的数(不包含重复)

做法:用大白上的有限队列做法,先将第一列的数放进从小到大的优先队列,每出队一个数就将同一行的下一个数放入队列

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]

转载于:https://www.cnblogs.com/cdyboke/p/4925069.html

你可能感兴趣的文章
小D课堂 - 新版本微服务springcloud+Docker教程_3-06 服务注册和发现之Eureka Client搭建商品服务实战...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_3-07 Eureka服务注册中心配置控制台问题处理...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_4-01 常用的服务间调用方式讲解
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_4-02 微服务调用方式之ribbon实战 订单调用商品服务...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_4-03 高级篇幅之Ribbon负载均衡源码分析实战...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_4-06 Feign核心源码解读和服务调用方式ribbon和Feign选择...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_5-02 Netflix开源组件断路器
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_5-01分布式核心知识之熔断、降级
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_5-04 feign结合hystrix断路器开发实战下...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_5-03 feign结合hystrix断路器开发实战上...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_6-01 微服务网关介绍和使用场景
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_5-05熔断降级服务异常报警通知
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_6-03 高级篇幅之zuul常用问题分析
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_5-08 断路器监控仪表参数
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_6-02 springcloud网关组件zuul
查看>>
小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-1.快速搭建SpringBoot项目,采用Eclipse...
查看>>
小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-4.在线教育后台数据库设计...
查看>>
小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-3.热部署在Eclipse和IDE里面的使用...
查看>>
小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-3.在线教育站点需求分析和架构设计...
查看>>