1、题目大意:就是给你三个数组啦,然后让你找到其中的第K大,但是,不可以直接访问数组,必须通过一种函数,最后的分数

是看调用几次这个函数,100次以内10分,2000以内6分。。。。

2、分析:最开始,并不会100分啦,所以就敲了一个六十分的代码,

就是二分一个值,然后再套一个二分验证一下,这样就过了60分(可还是憋了one hour)

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <ctime>
#include <kth.h>
using namespace std;
int get_a_min(int na, int value){
    if(na == 0) return 0;
    int l = 0, r = na - 1;
    int odl = 0, odr = 0;
    while(l < r){
        int mid = (l + r) / 2;
        if(get_a(mid) > value) r = mid - 1;
        else l = mid;
        if(odl == l && odr == r) break;
        odl = l; odr = r;
    }
    if(get_a(r) <= value) return r + 1;
    else return l + 1;
}
int get_b_min(int nb, int value){
    if(nb == 0) return 0;
    int l = 0, r = nb - 1;
    int odl = 0, odr = 0;
    while(l < r){
        int mid = (l + r) / 2;
        if(get_b(mid) > value) r = mid - 1;
        else l = mid;
        if(odl == l && odr == r) break;
        odl = l; odr = r;
    }
    if(get_b(r) <= value) return r + 1;
    else return l + 1;
}
int get_c_min(int nc, int value){
    if(nc == 0) return 0;
    int l = 0, r = nc - 1;
    int odl = 0, odr = 0;
    while(l < r){
        int mid = (l + r) / 2;
        if(get_c(mid) > value) r = mid - 1;
        else l = mid;
        if(odl == l && odr == r) break;
        odl = l; odr = r;
    }
    if(get_c(r) <= value) return r + 1;
    else return l + 1;
}
int query_kth(int n_a, int n_b, int n_c, int k){
    int l = 0, r = max(max(get_a(n_a - 1), get_b(n_b - 1)), get_c(n_c - 1));
    int odl = 0, odr = 0;
    while(l < r){
        int mid = (l + r) / 2;
        int wt = get_a_min(n_a, mid) + get_b_min(n_b, mid) + get_c_min(n_c, mid);
        if(wt < k) l = mid;
        else r = mid;
        if(odl == l && odr == r) break;
        odl = l; odr = r;
    }
    int o1 = get_a_min(n_a, l) + get_b_min(n_b, l) + get_c_min(n_b, l);
    int o2 = get_a_min(n_a, r) + get_b_min(n_b, r) + get_c_min(n_b, r);
    if(o1 >= k) return l + 1;
    else return r;
}

第k/3个数求出来,然后就是选最小的那个数组,
这个数组的前k/3个数都没有用了,我们就可以删掉,然后每次删删删,于是递归若干次,就可以100分了
#include"kth.h"
#include<iostream>
using namespace std;
int query_kth(int n_a,int n_b,int n_c,int k){
    int ca=0,cb=0,cc=0;
    int t_min;
    while(k){
        int t=max(0,k/3-1); int ta=get_a(ca+t),tb=get_b(cb+t),tc=get_c(cc+t);
        t_min=min(ta,min(tb,tc));t++;
        if(t_min==ta)ca+=t; else if(t_min==tb)cb+=t; else cc+=t; k-=t;
    }
    return t_min;
}

UOJ52——【UR #4】元旦激光炮的更多相关文章

  1. UOJ.52.[UR #4]元旦激光炮(交互 思路)

    题目链接 \(Description\) 交互库中有三个排好序的,长度分别为\(n_a,n_b,n_c\)的数组\(a,b,c\).你需要求出所有元素中第\(k\)小的数.你可以调用至多\(100\) ...

  2. #52. 【UR #4】元旦激光炮 (交互式题)

    链接:http://uoj.ac/problem/52 刚刚越过绝境长城,只见天空中出现了炫目的光芒 —— 圣诞老人出现了. 元旦三侠立刻进入战斗.生蛋侠.圆蛋侠和零蛋侠分别有 na,nb,ncna, ...

  3. [UOJ #52]【UR #4】元旦激光炮

    题目大意:交互题,给你三个有序数组,长度分别为$n\_a,n\_b,n\_c$,都不超过$10^5$.三个函数$get\_a(i),get\_b(i),get\_c(i)$,分别返回$a_i,b_i, ...

  4. UOJ#52. 【UR #4】元旦激光炮(交互)

    题意 给出三个已经排好序的数组$a, b, c$ 在$100$次询问内找出第$k$小的元素 Sol 一种很显然的$log^2n$的做法:首先在$a$中二分,然后再$b,c$中二分.这样可以得到$60$ ...

  5. Uoj 52. 【UR #4】元旦激光炮 神题+交互题

    Code: #include "kth.h" #include<iostream> int minn(int x,int y){return x<y?x:y;}; ...

  6. UOJ 52 元旦激光炮

    http://uoj.ac/problem/52 题意:每次可以得到3个序列中 思路:每次分别取出三个序列的K/3长度的位置,取最小的那个,然后每次减掉它,总复杂度是Nlog3N #include & ...

  7. 【uoj#51】[UR #4]元旦三侠的游戏 博弈论+dp

    题目描述 给出 $n$ 和 $m$ ,$m$ 次询问.每次询问给出 $a$ 和 $b$ ,两人轮流选择:将 $a$ 加一或者将 $b$ 加一,但必须保证 $a^b\le n$ ,无法操作者输,问先手是 ...

  8. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  9. 【UOJ#51】【UR #4】元旦三侠的游戏(博弈论)

    [UOJ#51][UR #4]元旦三侠的游戏(博弈论) 题面 UOJ 题解 考虑暴力,\(sg[a][b]\)记录\(sg\)函数值,显然可以从\(sg[a+1][b]\)和\(sg[a][b+1]\ ...

随机推荐

  1. Install R & RStudio for Ubuntu

    Install R r-project.org official source to install the latest R system. add R source   sudo vi /etc/ ...

  2. CSS3-实现单选框radio的小动画

    在微信上看到一个教程文,觉得制作的小动画还是很有意思的,自己也试验了一下.一开始动画怎么都不执行(我用的HB),因为内置浏览器对css3的不兼容.加上各种浏览器前缀后就好了.但是旋转那个效果,在HB里 ...

  3. Android Studio MultiDex 分包碰到的坑

    前天准备发包了,测试完毕,打好正式签名包,装到手机上,运行不起来. 网上查了大量资料,都没有解决方案. log显示如下: 04-26 10:07:57.727 1538-1538/? I/MultiD ...

  4. Lock的用法,为什么要用?

    当多个进程分享数据的时候,对某段程序代码要lock(当对分享数据进行改写的时候). 我们先看些这段代码: namespace ThreadTest { class Program { static b ...

  5. Jquery 实现密码框的显示与隐藏【转载自http://blog.csdn.net/fengzhishangsky/article/details/11809069】

    <html> <head>  <script type="text/JavaScript"  src="jQuery-1.5.1.min.j ...

  6. JavaScript 的性能优化:加载和执行

    随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 ...

  7. python中配置文件写法

    import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) print(BASE_DIR) USE ...

  8. sqlserver权限体系(下)

    简介 在上一篇文章中,我对主体的概念做了全面的阐述.本篇文章接着讲述主体所作用的安全对象以及所对应的权限. 理解安全对象(Securable) 安全对象,是SQL Server 数据库引擎授权系统控制 ...

  9. iOS-马上着手开发iOS应用应用程序-第二部分构建应用程序

    第二部分构建应用程序 1,应用程序开发过程 2,设计用户界面 3,定义交互 4,教程:串联图 1,应用程序开发过程 定义概念 设计用户界面 定义交互 实现行为整合数据 对象是应用程序的基石 类是对象的 ...

  10. spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别

    主要区别就是: BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能,下面举个例子说明 BEAN类: package com.spring ...