第K小数

题目背景

SOURCE:NOIP2016-AHSDFZ T1

题目描述

有两个正整数数列,元素个数分别为 N 和 M 。从两个数列中分别任取一个数相乘,这样一共可以得到 N*M 个数,询问这 N*M 个数中第 K 小数是多少。

输入格式

第一行为三个正整数 N,M 和 K 。

第二行为 N 个正整数,表示第一个数列。

第三行为 M 个正整数,表述第二个数列。

输出格式

输出包含一行,一个正整数表示第 K 小数。

样例数据 1

输入 

2 3 4

1 2

2 1 3

输出

3

样例数据 2

输入 

5 5 18

7 2 3 5 8

3 1 3 2 5

输出

16

备注

【数据规模与约定】

这里写图片描述

这次考试差点爆0" role="presentation" style="position: relative;">00(惊了*1),这道一(简)眼(单)题考试竟然写挂了,30" role="presentation" style="position: relative;">3030分滚粗,下来后听说我的方法可以过70" role="presentation" style="position: relative;">7070(惊了*2),然后 讲讲这道题怎么做吧。

70" role="presentation" style="position: relative;">7070算法很好想,二分第k" role="presentation" style="position: relative;">kk大取值,然后用upperbound" role="presentation" style="position: relative;">upperboundupperbound统计mid" role="presentation" style="position: relative;">midmid大的数的个数,然后就70" role="presentation" style="position: relative;">7070分了。

然而这个算法的时间效率并不优秀,我们要想办法去掉一个log" role="presentation" style="position: relative;">loglog,观察到check" role="presentation" style="position: relative;">checkcheck时随着一个数组中的值的增大,另一个数列中可以满足ai∗bj" role="presentation" style="position: relative;">ai∗bjai∗bj成立的j" role="presentation" style="position: relative;">jj的个数单调不升,这样的话我们没必要用upperbound" role="presentation" style="position: relative;">upperboundupperbound,直接利用单调性统计就行了。

代码如下:

#include<bits/stdc++.h>
#define ll long long
#define N 200005
using namespace std;
int n,m,a[N],b[N];
ll k;
inline ll read(){
    ll ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    return ans;
}
inline ll check(ll k){
    ll up=m,cnt=0;
    for(int i=1;i<=n;++i){
        ll v=k/a[i];
        while(up&&b[up]>v)--up;
        cnt+=up;
    }
    return cnt;
}
int main(){
    n=read(),m=read(),k=read();
    for(int i=1;i<=n;++i)a[i]=read();
    for(int i=1;i<=m;++i)b[i]=read();
    sort(a+1,a+n+1),sort(b+1,b+m+1);
    ll l=a[1]*(ll)b[1],r=a[n]*(ll)b[m];
    while(l<r){
        ll mid=l+r>>1;
        if(check(mid)>=k)r=mid;
        else l=mid+1;
    }
    printf("%lld",l);
    return 0;
}

2018.07.08 NOIP模拟 第K小数(二分)的更多相关文章

  1. 2018.07.08 NOIP模拟 好数(线段树)

    好数 题目背景 SOURCE:NOIP2016-AHSDFZ T3 题目描述 我们定义一个非负整数是"好数",当且仅当它符合以下条件之一: 1. 这个数是 0 或 1 . 2. 所 ...

  2. 2018.07.08 NOIP模拟 ABCD(背包)

    ABCD 题目背景 SOURCE:NOIP2016-AHSDFZ T2 题目描述 有 4 个长度为 N 的数组 a,b,c,d .现在需要你选择 N 个数构成数组e ,数组e 满足 a[i]≤e[i] ...

  3. EZ 2018 07 06 NOIP模拟赛

    又是慈溪那边给的题目,这次终于没有像上次那样尴尬了, T1拿到了较高的暴力分,T2没写炸,然后T3写了一个优雅的暴力就203pts,Rank3了. 听说其它学校的分数普遍100+,那我们学校还不是强到 ...

  4. 2018.10.08 NOIP模拟 序列(主席树)

    传送门 T2防ak题? 其实也不是很难(考试时sb了). 直接变形一下求出区间长度在[l2,r2][l2,r2][l2,r2]之间,中位数≤l1−1\le l1-1≤l1−1的区间数,和区间长度在[l ...

  5. 2018.11.08 NOIP模拟 班车(倍增+dfs+bit)

    传送门 对于每个点离线处理出向上走2i2^i2i班车到的最上面的点. 然后每个询问(u,v)(u,v)(u,v)先把(u,v)(u,v)(u,v)倍增到刚好走不到lcalcalca的情况(有一个点如果 ...

  6. 2018.11.08 NOIP模拟 水管(简单构造)

    传送门 仔细读题会发现只要所有点点权之和等于0一定有解. 如何构造? 直接当做树来构造就行了,非树边都赋值成0就行. 代码

  7. 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)

    传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...

  8. 2018.10.08 NOIP模拟 栅栏(树状数组+rand)

    传送门 今天的送分题. 首先考虑每次给要围上栅栏的矩阵里的整体加上1,如果栅栏被撤销就整体减1,最后比较两个点的值是否相同来进行判断. 然而这样的效果并不理想,很容易卡掉. 进一步思考,我们第iii次 ...

  9. 2018.10.08 NOIP模拟 斐波那契(贪心+hash/map)

    传送门 签到题. 显然是可以贪心分组的,也就是尽量跟当前的分成一组. 这时我们需要判断a[l]+a[r],a[l+1]+a[r]...a[r−1]+a[r]a[l]+a[r],a[l+1]+a[r]. ...

随机推荐

  1. plsql 执行批量文件

    plsql 执行批量文件 plsql>command window @c:\a.sql;@c:\b.sql;@c:\c.sql;

  2. as3 声明变量

    var a:int=0, b, c:Number=2; trace(a,b,c) /* 0 undefined 2 */ var a:int, b:uint, c:Number; var d:Stri ...

  3. ubuntu 命令安装软件

    终端安装(命令安装).第一,找到终端或者按住Ctrl+Alt+t 打开终端;第二输入命令,命令如下:cd /xxx/xxx/,(xxx代表软件包路径,一直到你放置软件包的文件夹),之后输入命令:sud ...

  4. Supervisor 进程管理工具

    简介: Supervisor 进程管理工具 一.安装 shell > yum -y install python-pip shell > pip install supervisor # ...

  5. CVE2016-8863libupnp缓冲区溢出漏洞原理分析及Poc

    1.libupnp问题分析: (1)问题简述: 根据客户给出的报告,通过设备安装的libupnp软件版本来判断,存在缓冲区溢出漏洞:CVE-2016-8863. (2)漏洞原理分析: 该漏洞发生在up ...

  6. 用java编写一个函数,用于计算桌子的面积,可计算任意边长的桌子

    /* *桌子实体类,有属性和方法 */public class Table {    String name; // 声明桌子名称    Double width; // 声明桌子宽度    Doub ...

  7. 分类模型评估之ROC-AUC曲线和PRC曲线

    http://blog.csdn.net/pipisorry/article/details/51788927 在样本分布及其不均匀的情况下,建议用PRC...可以看下这个精确率.召回率.F1 值.R ...

  8. Python递归的经典案例

    目录 : 一.递归的简介 二.递归的经典应用   2.1 递归求阶乘   2.2 递归推斐波那契数列   2.3 二分法找有序列表指定值   2.4 递归解汉诺塔 前言: 当我们碰到诸如需要求阶乘或斐 ...

  9. CAP理论(摘)

    先解释一下软件编程中常见的一些概念: 抽象先于具象.这个抽象并非虚无的抽象,而是指事物尚未分化为具象之前的那个前体存在.当那个前体存在分化成具象存在之后,前体存在就退化为背景,成为一种抽象. 结构是关 ...

  10. Spark之 Spark Streaming整合kafka(Java实现版本)

    pom依赖 <properties> <scala.version>2.11.8</scala.version> <hadoop.version>2.7 ...