题解【CJOJ2608】[JZOJ 100043]第k小数
Description
有两个非负整数数列,元素个数分别为N和M。从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少。
时间限制为20ms 。
Input
输入文件包含三行。
第一行为三个正整数N,M和K。
第二行为N个整数,表示第一个数列。
第三行为M个整数,表述第二个数列。
Output
输出文件包含一行,一个正整数表示第K小数。
Sample Input
Sample1:
2 3 4
1 2
2 1 3
Sample2:
5 5 18
7 2 3 5 8
3 1 3 2 5
Sample Output
Sample1:
3
Sample2:
16
Hint

Source
二分 /单调性
source JZOJ 100043
鸣谢陈思宇制作数据!
Solution
我们先对于a、b数组分别排一次序,使这两个数组都具有单调性。
考虑二分答案。
假设现在二分到了mid,那么前k小的数都应满足a[i]*b[j]≤mid。
现在,我们要枚举i和j使得mid满足上述条件。
考虑如何快速地算出j。
由于a、b数组都具有了单调性,因此我们得到的j也是单调递减的,就可以利用单调性轻松求出j。
所以我们得出的算法的时间复杂度为O(N*log(最大的数)),轻松通过!
Code
#include <bits/stdc++.h>
#define int long long using namespace std; inline int read()//快读
{
int f = , x = ;
char c = getchar(); while (c < '' || c > '')
{
if (c == '-')
f = -;
c = getchar();
} while (c >= '' && c <= '')
{
x = x * + c - '';
c = getchar();
} return f * x;
} int n, m, k, a[], b[]; signed main()
{
n = read(), m = read(), k = read(); for (register int i = ; i <= n; i++)
{
a[i] = read();
} for (register int i = ; i <= m; i++)
{
b[i] = read();
} sort(a + , a + + n);//排序
sort(b + , b + + m); int l = , r = a[n] * b[m]; while (l < r)//二分
{
int mid = (l + r) >> , sum = ; for (register int i = , j = m; i <= n; i++, sum = sum + j)//枚举i,并且计算满足条件的个数
{
while (a[i] * b[j] > mid)//如果满足条件
{
--j;//每次更新j
}
} if (sum >= k)//如果答案比k大
{
r = mid;//缩小最大值范围
}
else
{
l = mid + ;//否则更新最小值
}
} printf("%lld", l);//输出符合条件的答案个数 return ;//结束
}
题解【CJOJ2608】[JZOJ 100043]第k小数的更多相关文章
- JZOJ 10043 第k小数
Description 有两个非负整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到NM个数,询问这NM个数中第K小数是多少. 时间限制为20ms . Input 输入文 ...
- OJ2237第k小数题解
题目描述: 有n个数,请你找出第k小的数. 输入描述: 第一行有2个正整数n,k(n,k<=10^7)第二行有n个非负数ai(ai<=10^5) 输出描述: 输出第k小的数. 输入样例: ...
- NC207028 第k小数
NC207028 第k小数 题目 题目描述 给你一个长度为 \(n\) 的序列,求序列中第 \(k\) 小数的多少. 输入描述 多组输入,第一行读入一个整数 \(T\) 表示有 \(T\) 组数据. ...
- 第K 小数
[问题描述]有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少.[输入格式]输入文件名为number.in.输入文件包 ...
- 数组第K小数问题 及其对于 快排和堆排 的相关优化比较
题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...
- Bsoj 1322 第K小数
第K小数 Description 现在已有N个整数,你有以下三种操作: 1 A:表示加入一个值为A的整数: 2 B:表示删除其中值为B的整数: 3 K:表示输出这些整数中第K小的数: Input 第一 ...
- 算法打基础——顺序统计(找第k小数)
这次主要是讲如何在线性时间下找n个元素的未排序序列中第k小的数.当然如果\(k=1 or k=n\),即找最大最小 数,线性时间内遍历即可完成,当拓展到一般,如中位数时,相关算法就值得研究了.这里还要 ...
- 查找第K小数
题目描述 查找一个数组的第K小的数,注意同样大小算一样大. 如 2 1 3 4 5 2 第三小数为3. 输入描述: 输入有多组数据.每组输入n,然后输入n个整数(1<=n<=1000), ...
- 【递归打卡2】求两个有序数组的第K小数
[题目] 给定两个有序数组arr1和arr2,已知两个数组的长度分别为 m1 和 m2,求两个数组中的第 K 小数.要求时间复杂度O(log(m1 + m2)). [举例] 例如 arr1 = [1, ...
随机推荐
- 剑指offer-面试题13-机器人的运动范围-递归法
/* 题目: 地上有一个m行n列的方格.一个机器人从坐标(0,0)的格子开始运动, 每次可向上.下.左.右移动一格,但不能进入行坐标和列坐标之和大于k的格子. 如,当k=18时,机器人能进入(35,3 ...
- phpcms v9 标签调用,函数,sql
1.截取调用标题长度 {str_cut($r[title],36,'')} 2.格式化时间 调用格式化时间 2011-05-06 11:22:33 {date('Y-m-d H:i:s',$r[inp ...
- PAT - A1073
1073 Scientific Notation (20point(s)) 小数点移动的边界条件 小数点左移 超过数据左边界 小数点右移 未超过数据右边界 超过数据右边界 +0.1E+2 --> ...
- BurpSuite 汉化版(含注册机)安装教程
1.注册机使用方法 首先需要完成java安装及环境变量配置. 打开burp-loader-keygen.jar(注册机)--点击run--license text (随意写)--然后将生成的lic ...
- 扩展BSGS求解离散对数问题
扩展BSGS用于求解axΞb mod(n) 同余方程中gcd(a,n)≠1的情况 基本思路,将原方程转化为a与n互质的情况后再套用普通的BSGS求解即可 const int maxint=((1< ...
- XSS漏洞原理
注入型漏洞的本质都是服务端分不清用户输入的内容是数据还是指令代码,从而造成用户输入恶意代码传到服务端执行. 00x01js执行 Js是浏览器执行的前端语言,用户在存在xss漏洞的站点url后者能输入数 ...
- vue.js中使用离线检测
Html5在window.navigator对象上添加了一个属性onLine 返回布尔值 true表示在线.同时新增了两个事件: window.addEventListener('online', f ...
- linux - mysql:启动 mysql
启动mysql 第一种: /etc/rc.d/init.d/mysqld start /etc/rc.d/init.d/mysqld stop 第二种:使用service 启动.关闭MySQL服务 s ...
- ntpq -p命令详解
ntpq用来监视ntpd操作,ntpq -p查询网络中的NTP服务器,同时显示客户端和每个服务器的关系 [root@localhost ~]# ntpq -p remote ...
- 【15】【有点特殊的dp】 剪绳子
题目 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] .请问 k[0]k[1]...* ...