题目链接:点击查看

题目大意:给出一个n*m的矩阵,每个位置的元素为 maze [ i ] [ j ] = a [ i ] * b [ j ],现在给出数组 a 和数组 b ,求出矩阵中第k大的数

题目分析:首先别读错题了,第k大的意思是第n*m+1-k小的数,我们可以转换一下比较方便理解,给出数组 a 和数组 b 后,我们可以排序处理,因为涉及到负数的关系,直接计算的话无法保证其单调性,所以我们可以分类讨论,在main函数中二分答案,对于每个答案找一下有多少个数小于等于当前答案,寻找的方法我们可以用遍历+二分的方法找,注意要分大于零,小于零和等于零的情况,这样总的时间复杂度为nlognlogn,光理论不好说清楚,看看代码估计就明白了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;LL n,m,k,a[N],b[N];bool check(LL x)
{LL cnt=0;for(int i=1;i<=n;i++)//枚举数组a的每个元素,当数组a确定后,a*b就有单调性了{if(a[i]==0){if(x>=0)cnt+=m;}else if(a[i]>0)//如果a>0,那么a*b的单调性与b相同{int l=1,r=m,ans=0;while(l<=r)//二分有多少个数小于等于答案{int mid=l+r>>1;if(a[i]*b[mid]<=x){ans=mid;l=mid+1;}elser=mid-1;}cnt+=ans;}else if(a[i]<0)//如果a<0,那么a*b的单调性与b相反{int l=1,r=m,ans=m+1;while(l<=r){int mid=l+r>>1;if(a[i]*b[mid]<=x)//二分有多少个数小于等于答案{ans=mid;r=mid-1;}elsel=mid+1;}cnt+=m+1-ans;}}return cnt>=k;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);scanf("%lld%lld%lld",&n,&m,&k);k=n*m+1-k;for(int i=1;i<=n;i++)scanf("%lld",a+i);for(int i=1;i<=m;i++)scanf("%lld",b+i);sort(a+1,a+1+n);sort(b+1,b+1+m);LL l=-1e12,r=1e12,ans;while(l<=r)//二分答案{LL mid=l+r>>1;if(check(mid)){ans=mid;r=mid-1;}elsel=mid+1;}printf("%lld\n",ans);return 0;
}

牛客 - 乘法(二分套二分)相关推荐

  1. qduoj - WHY吃糖果(二分套二分)

    题目链接:点击查看 题目大意:给出一个n*n的矩阵,每个格子的权值为i*i+j*j+i*j+100000*(i-j),求该矩阵中第m小的权值为多少 题目分析:这个题在选拔的时候给我整自闭了,看到n有5 ...

  2. 牛客 - 动物森友会(二分+最大流)

    题目链接:点击查看 题目大意:给出 n 个任务,每个任务只能在每周固定的星期完成,需要完成 c 次,现在每天可以完成 m 次,问最少需要几天才能将所有任务完成 题目分析:上当了..读完题后感觉是网络流 ...

  3. 牛客 - Sixth Sense(贪心+二分)

    题目链接:点击查看 题目大意:给出两个长度为 n 的数列记为 a 和 b,现在 a 的数列固定不动,问如何对数列 b 进行排列,可以使得: b[ i ] > a[ i ] (严格大于)的位置尽可 ...

  4. 牛客多校4J二分答案连续子段最大平均值

    题目 Average 问题可以转化为 求长度不小于K的子段的最大平均值.POJ2018原题. 其中一种比较简单的方法是,二分出答案 m i d mid mid,对原数组每个数减去 m i d mid ...

  5. 主席树 + 后缀数组求LCP + 二分套二分 ---- P4094 [HEOI2016/TJOI2016]字符串

    题目链接 题目大意: 解题思路: 设我们的答案为midmidmid(注意这里有坑是[a,b][a,b][a,b]的所有子串和[c,d][c,d][c,d]这个子串的最长lcplcplcp),那么我们会 ...

  6. poj3685 二分套二分

    F - 二分二分 Crawling in process... Crawling failed Time Limit:6000MS     Memory Limit:65536KB     64bit ...

  7. 【NOI2012】骑行川藏【拉格朗日乘数法】【二分套二分】

    传送门 拉格朗日乘数法裸题 限制 f({v})=∑i=1nkisi(vi−vi′)=EUf(\{v\})=\sum_{i=1}^nk_is_i(v_i-v_i')=E_Uf({v})=i=1∑n​ki ...

  8. 【牛客OI周赛7-普及组ABCD 非官方题解】暴力,二分,KMP,尺取(STL或Hash)

    A: 链接:https://ac.nowcoder.com/acm/contest/372/A 来源:牛客网 某天,一只可爱的肥橘喵在路上走,突然遇到了一个怪人,那怪人自称PM6,"小肥喵, ...

  9. 解题报告 - 牛客练习赛63 C - 牛牛的揠苗助长(货仓选址+二分)

    链接:https://ac.nowcoder.com/acm/contest/5531/C 来源:牛客网 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号 ...

最新文章

  1. docker存储结构解析
  2. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )
  3. Shell获取时间,日期,上月,当月,下月
  4. mongodb启动不能锁定_使用MongoDB进行乐观锁定重试
  5. c++异常处理机制示例及讲解
  6. skywalking oap-server 域名配置
  7. ACM_基础知识(二)
  8. python展示文件_python之文件的读写和文件目录以及文件夹的操作实现代码
  9. 兄弟打印机内存已满清零方法_brother打印机怎么清零?brother打印机清零方法
  10. 阵列信号处理学习小结
  11. 产品经理入门知识梳理
  12. Illustrator CC 2019for Mac完美直装版无需破解
  13. 操作系统的功能、作用、分类
  14. 时间管理类APP分析:拇指时间
  15. 工作十年的程序员,却拿着毕业三年的工资,再不开窍就真晚了!
  16. 【LeetCode】马三来刷题之Valid Anagram
  17. 基于Pytorch实现的快速人脸识别模型
  18. vue知识点详解,Vue之v-prev、vue-virtual-scroll-list、alise、data动态添加数据、v-for中的key值等
  19. yolov5 继续训练
  20. 市场调研你所不知道的几个关键点

热门文章

  1. linux 设备文件分区命令,Linux常见设备及相应/dev/xxx文件名、Mount Point、挂载点、Mount命令、fstab、挂载分区(示例代码)...
  2. 荧光透视的计算机辅助外科手术,「电信学」「2008.11」基于荧光透视的电磁跟踪骨科X射线导航实践研究...
  3. MySQL高级 - 锁 - InnoDB行锁 - 类型
  4. MySQL高级 - 索引的使用 - 覆盖索引
  5. 代理模式中的动态代理
  6. 从SpringBootApplication注解入手
  7. SpringMVC简介-SpringMVC概述
  8. php 获取设备,PHP获取设备类型实例代码
  9. 数字转换英语c语言程序,c语言 把英文数字 例如 one hundred and eleven 转换位数字 111;怎样编写程序,要求1~1000内的英文数字...
  10. JAVA学生成绩分析系统任务书,学籍管理系统任务书