UOJ52——【UR #4】元旦激光炮
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】元旦激光炮的更多相关文章
- UOJ.52.[UR #4]元旦激光炮(交互 思路)
题目链接 \(Description\) 交互库中有三个排好序的,长度分别为\(n_a,n_b,n_c\)的数组\(a,b,c\).你需要求出所有元素中第\(k\)小的数.你可以调用至多\(100\) ...
- #52. 【UR #4】元旦激光炮 (交互式题)
链接:http://uoj.ac/problem/52 刚刚越过绝境长城,只见天空中出现了炫目的光芒 —— 圣诞老人出现了. 元旦三侠立刻进入战斗.生蛋侠.圆蛋侠和零蛋侠分别有 na,nb,ncna, ...
- [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, ...
- UOJ#52. 【UR #4】元旦激光炮(交互)
题意 给出三个已经排好序的数组$a, b, c$ 在$100$次询问内找出第$k$小的元素 Sol 一种很显然的$log^2n$的做法:首先在$a$中二分,然后再$b,c$中二分.这样可以得到$60$ ...
- Uoj 52. 【UR #4】元旦激光炮 神题+交互题
Code: #include "kth.h" #include<iostream> int minn(int x,int y){return x<y?x:y;}; ...
- UOJ 52 元旦激光炮
http://uoj.ac/problem/52 题意:每次可以得到3个序列中 思路:每次分别取出三个序列的K/3长度的位置,取最小的那个,然后每次减掉它,总复杂度是Nlog3N #include & ...
- 【uoj#51】[UR #4]元旦三侠的游戏 博弈论+dp
题目描述 给出 $n$ 和 $m$ ,$m$ 次询问.每次询问给出 $a$ 和 $b$ ,两人轮流选择:将 $a$ 加一或者将 $b$ 加一,但必须保证 $a^b\le n$ ,无法操作者输,问先手是 ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- 【UOJ#51】【UR #4】元旦三侠的游戏(博弈论)
[UOJ#51][UR #4]元旦三侠的游戏(博弈论) 题面 UOJ 题解 考虑暴力,\(sg[a][b]\)记录\(sg\)函数值,显然可以从\(sg[a+1][b]\)和\(sg[a][b+1]\ ...
随机推荐
- JavaScript---认识JavaScipt
认识JavaScript 1.什么是JavaScript? JavaScript是属于网络的脚本语言,她被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies以及更多的应用,她更是因特 ...
- js随笔,css和js禁止网页选择文本,table的class样式使得td的class样式失效,jquery获得元素坐标
css使用user-select,user-select不是W3C标准,浏览器支持不完整:user-select有两个值,none用户不可以选择文本,text用户可以选择文本 body{-moz-us ...
- 【C++11】新特性——auto的使用
[C++11]新特性——auto的使用 C++11中引入的auto主要有两种用途:自动类型推断和返回值占位.auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后 ...
- paramiko模拟ansible远程执行命令
主模块 #!/usr/bin/env python from multiprocessing import Process import paramiko import time import sys ...
- Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast的解决方法: 在命令行输入:yum clean al ...
- A股博弈笔记
A股博弈笔记 @2014/11/07 A股行情最近甚嚣尘上,似乎是牛市的前奏,指数虽然见涨,但赔钱的股民估计也不少,本人就是其中一个,是我在逆势而行吗? 试图追逐价值投资的方式,而钟情于蓝筹股,本来也 ...
- svn三大目录trunk、branch和tag
SVN中Branch和tag的比较在SVN中Branch和tag在一个功能选项中,在使用中也往往产生混淆.在实现上,branch和tag,对于svn都是使用copy实现的,所以他们在默认的权限上和一般 ...
- shell编程中的select用法
select 语句 select表达式是bash的一种扩展应用,擅长于交互式场合.用户可以从一组不同的值中进行选择: select var in ... ; do break; done .... n ...
- ktouch移动端事件库
最近闲来无事,写了个移动端的事件库,代码贴在下面,大家勿拍. /** @version 1.0.0 @author gangli @deprecated 移动端触摸事件库 */ (function ( ...
- wtforms 使用
wtforms是一个表单模板库, 下面以修改密码表单为例简单说明其用法. 我们可以用python代码定义form的基本元素, 比如用户名/邮箱, 并给定各个元素的validation条件. 然后在re ...