第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. python 逐行读取文本

    f = open("foo.txt") # 返回一个文件对象line = f.readline() # 调用文件的 readline()方法while line: print li ...

  2. mysql查看进程

    select * from information_schema.processlist 查询所有连接到数据库的进程信息.

  3. delphi 颜色转换函数总结

    unit UColor; interface uses windows, sysutils, classes, graphics; function HexToInt(Hexa: String): L ...

  4. win10为什么不能把文件直接拖拽

  5. ASP.NET MVC 项目文件夹结构

    首先,打开Visual Studio, 新建一个demo 项目的solution,选择 Blank Soution. 第二步,创建文件夹,按自己的需求创建.在这个Demo 中,我将创建4个文件夹. P ...

  6. spring ioc xml配置

    一个完整的spring xml配置:是把action,service,dao以及其它的资源性配置(如basedao)和公共性配置(如连接数据库)配置在resource.xml中,这样就有四个xml配置 ...

  7. SpringBoot配置文件YML 注意事项

    YML读取注意事项 使用YML时遇到的坑: 最近在做项目时,遇到了一些在读取YML配置时发生的问题,在这里写一并写下来,希望给自己以及大家一个提示,能尽量避免在读取配置文件时发生这些错误,给开发带来不 ...

  8. spring boot 启动方式

    一:IDE 运行Application这个类的main方法 二:在springboot的应用的根目录下运行mvn spring-boot:run 三:使用mvn install 生成jar后运行 先到 ...

  9. oracle,PL/SQL新建表

    创建用户 -- Create the user create user U_HQ_JAVA default tablespace USERS temporary tablespace TEMP pro ...

  10. nyoj528-找球号(三) 【位运算】

    http://acm.nyist.net/JudgeOnline/problem.php?pid=528 找球号(三) 时间限制:2000 ms  |  内存限制:3000 KB 难度:2   描述 ...