第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. as3 运算与检查String 是否能够正确转换成数 值

    如果忘了对一个Number 型变量初始化,那么这个变量参与的任何数学运算的结果都是NaN:如果最终结果赋值给有声明类型的变量,那么为该变量的默认值(仅限uint ,int). var a:Number ...

  2. Java 跨域 CrossOrigin注解 Filter拦截 Nginx配置

    说明 资源请求的发起方与请求的资源不在同一个域中的: 一般的,只要网站的[协议名protocol].[主机host].[端口号port]这三个中的任意一个不同,网站间的数据请求与传输便构成了跨域调用: ...

  3. unity 加载读取外部XML

    cfg.xml <rootNode> <category name="网站"> <item name="mainPage"> ...

  4. one by one 项目 part 4

    出现异常”The last packet sent successfully to the server was 0 milliseconds ago.“的大部分原因是由于数据库回收了连接,而系统的缓 ...

  5. 机房servlet过滤器

    1.源代码 loginform.html <html> <head> <title>使用过滤器改变请求编码</title> <meta http- ...

  6. js中定时器之一

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. linux 安装SAMtools,bcftools,htslib,sratoolkit,bedtools,GATK,TrimGalore,qualimap,vcftools,bwa

    --------------------安装Samtools---------------------------------------------------------------------- ...

  8. Nexus 按项目类型分配不同的工厂来发布不同 项目

    但是有时候,一个公司会有很多项目[crm,oa,erp]等等的项目.如果把这些项目全部都放到releases或者snapshots中的话会有点混乱.比较好的办法是,按项目来分.每个项目一个工厂:cms ...

  9. 元素的定位id和name

    1.元素定位: 元素的定位是自动化测试的核心,要想操作一个元素,首先应该识别这个元素 webdriver提供了一系列的元素定位方法,常用的有以下几种 id name class name partia ...

  10. 使用VisualStudio开发php的图文设置方法[xyytit]

    早先在asp横行的年代,php和asp一样,大都都是html中夹杂代码,说实话,这时候IDE的确用处不是很大,倒是类似于dw之类的设计器甚为上手.   现在,三层.mvc之类的思想遍地开花,使得代码和 ...