UOJ#206. 【APIO2016】Gap(交互,乱搞)
有 NN 个严格递增的非负整数 a1,a2,…,aNa1,a2,…,aN(0≤a1<a2<⋯<aN≤10180≤a1<a2<⋯<aN≤1018)。你需要找出 ai+1−aiai+1−ai(0≤i≤N−10≤i≤N−1)里的最大的值。
你的程序不能直接读入这个整数序列,但是你可以通过给定的函数来查询该序列的信息。关于查询函数的细节,请根据你所使用的语言,参考下面的实现细节部分。
你需要实现一个函数,该函数返回 ai+1−aiai+1−ai(0≤i≤N−10≤i≤N−1)中的最大值。
实现细节
本题只支持 C/C++/Pascal。
C/C++
你需要包含头文件 gap.h。
你需要实现一个函数 findGap(T, N),该函数接受下面的参数,并返回一个 long long 类型的整数:
- TT:子任务的编号(11 或者 22)
- NN:序列的长度
你的函数 findGap 可以调用系统提供的查询函数 MinMax(s, t, &mn, &mx),该函数的前两个参数 ss 和 tt 是 long long 类型的整数,后两个参数 &mn 和 &mx 是 long long 类型的整数的指针(mn 和 mx 是 long long 类型的整数)。当 MinMax(s, t, &mn, &mx) 返回时,变量 mn 将会存储满足 ai∈[s,t]ai∈[s,t] 中 aiai 的最小值,变量 mx 将会存储满足 ai∈[s,t]ai∈[s,t],aiai 的最大值。如果区间 [s,t][s,t] 中没有序列中的数,则 mn 和 mx 都将存储 −1−1。在查询时需要满足 s≤ts≤t,否则程序将会终止,该测试点计为 00 分。
Pascal
你需要使用单元 graderhelperlib。
你需要实现一个函数 findGap(T, N),该函数接受下面的参数,并返回一个 Int64 类型的整数:
- TT:子任务的编号(11 或者 22)(Integer 类型)
- NN:序列的长度(LongInt 类型)
你的函数 findGap 可以调用系统提供的查询函数 MinMax(s, t, mn, mx),该函数的前两个参数 ss 和 tt 是 Int64 类型的整数,后两个参数 mn 和 mx 是传引用方式的 Int64 类型的整数(过程内部对这两个变量的修改会影响到外部的对应变量的值)。当 MinMax(s, t, mn, mx) 执行完毕时,变量 mn 将会存储满足 ai∈[s,t]ai∈[s,t] 中 aiai 的最小值,变量 mx 将会存储满足 ai∈[s,t]ai∈[s,t],aiai 的最大值。如果区间 [s,t][s,t] 中没有序列中的数,则 mn 和 mx 都将存储 −1−1。在查询时需要满足 s≤ts≤t,否则程序将会终止,该测试点计为 00 分。
样例一
C/C++
考虑 N=4,a1=2,a2=3,a3=6,a4=8N=4,a1=2,a2=3,a3=6,a4=8。
则答案应该是 33,可以通过下面的几组对 MinMax 的询问获得:
- 调用 MinMax(1, 2, &mn, &mx),则 mn 和 mx 皆返回 22。
- 调用 MinMax(3, 7, &mn, &mx),则 mn 返回 33,mx 返回 66。
- 调用 MinMax(8, 9, &mn, &mx),则 mn 和 mx 皆返回 88。
Pascal
考虑 N=4,a1=2,a2=3,a3=6,a4=8N=4,a1=2,a2=3,a3=6,a4=8。
则答案应该是 33,可以通过下面的几组对 MinMax 的询问获得:
- 调用 MinMax(1, 2, mn, mx),则 mn 和 mx 皆返回 22。
- 调用 MinMax(3, 7, mn, mx),则 mn 返回 33,mx 返回 66。
- 调用 MinMax(8, 9, mn, mx),则 mn 和 mx 皆返回 88。
样例评测方式
样例测评系统从标准输入中读入两行。第一行包含两个整数,子任务编号 TT,和序列长度 NN。第二行包含 NN 个严格递增的非负整数。然后该程序会向标准输出中写入两行,第一行为 findGap 的返回值,第二行为花费 MM 的值。
下面的输入描述了上面的样例:
2 4
2 3 6 8
限制与约定
对于所有的测试点,有 2≤N≤1000002≤N≤100000。
每一个测试点开始测试之前,MM 都将被初始化为 00。
子任务 1(30 分):每一次调用 MinMax 都将使 MM 加 11。为了获得所有分数,需要满足对于该子任务下的所有测试点,都有 M≤N+12M≤N+12。
子任务 2(70 分):定义 kk 为调用 MinMax 时,区间 [s,t][s,t] 中的序列中数的数量。每次调用 MinMax,将使 MM 加上 k+1k+1。对于每一个测试点,如果 M≤3NM≤3N,你将得到 70 分,否则将得到 60M/N+1√−160M/N+1−1 分。你的该子任务的得分是其下所有测试点中的最低分。
时间限制:1s1s
空间限制:256MB256MB
下载
人生中第一道交互
30分的做法比较简单(然而想了半个小时。。)。
每次询问两端的最大值,然后不断往中间缩,这样就能把原序列恢复出来
100分做法:
首先这一部分对询问次数没有限制,这样我们考虑从最小的点开始,慢慢询问
这里用到一个非常神奇的性质
对于最大值为$r$,最小值为$l$的区间,答案的最小值为$\frac{r-l}{N-1}$
考场上想不出来,不过看到之后觉得还是挺显然的
这样我们只需要关注长度大于它的区间就可以了,直接for循环往后推
#include "gap.h"
#include<queue>
#include<algorithm>
#define LL long long
const int MAXN = 1e6 + ;
LL a[MAXN];
long long findGap(int T, int N) {
if(T == ) {
LL l = , r = 1e22;
LL minn, maxn;
int now = ;
while(l <= r) {
MinMax(l + , r - , &minn, &maxn);
if(minn == maxn && minn != -) {a[++now] = minn;break;}
if(minn == -) break;
a[++now] = minn, a[N - now + ] = maxn;
if(now == (N + )/) break;
l = minn, r = maxn;
}
LL ans = ;
for(int i = ; i <= N; i++)
ans = std::max(ans, a[i] - a[i - ]);
return ans;
}
else {
LL l = , r = 1e22, last = -;
MinMax(l, r, &l, &r);
LL len = (r - l + N - ) / (N - );
if(N == ) return (r - l);
for(LL i = l; i <= r;) {
LL s = i, t = i + len;
MinMax(s, t, &s, &t); i += len + ;
if(last != - && s != -) len = std::max(len, s - last);
if(t != -) last = t;
}
return len;
}
}
UOJ#206. 【APIO2016】Gap(交互,乱搞)的更多相关文章
- 【uoj#209】[UER #6]票数统计 组合数+乱搞
题目描述 一个长度为 $n$ 的序列,每个位置为 $0$ 或 $1$ 两种.现在给出 $m$ 个限制条件,第 $i$ 个限制条件给出 $x_i$ .$y_i$ ,要求至少满足以下两个条件之一: 序列的 ...
- 【uoj#142】【UER #5】万圣节的南瓜灯 乱搞+并查集
题目描述 给出一张 $n\times m$ 的网格图,两个格子之间有一条双向边,当且仅当它们相邻,即在网格图中有一条公共边. 特殊地,对于 $1\le x\le n$ ,$(x,1)$ 和 $(x ...
- [APIO2016]Gap
题目:UOJ#206. 题目大意:由于过于冗长,不好解释,所以详见原题. 解题思路:这是一道交互题. 对于第一问,很容易解决.由于数列严格递增,所以不会出现相等的情况. 首先调用MinMax(0,10 ...
- 洛谷P5211 [ZJOI2017]字符串(线段树+乱搞)
题面 传送门 题解 为什么大佬们全都是乱搞的--莫非这就是传说中的暴力能进队,乱搞能AC-- 似乎有位大佬能有纯暴力+玄学优化\(AC\)(不算上\(uoj\)的\(Hack\)数据的话--这要是放到 ...
- URAL 1827 Indigenous Wars(排序、乱搞)
题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...
- UVA 11853 [dfs乱搞]
/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- 【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)
4692: Beautiful Spacing Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 46 Solved: 21[Submit][Statu ...
- 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞
3578: GTY的人类基因组计划2 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 159[Submit][Status][ ...
- 【BZOJ-2937】建造酿酒厂 前缀和 + 展环为链 + 乱搞
2937: [Poi2000]建造酿酒厂 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 70 Solved: 24[Submit][Status][D ...
随机推荐
- elixir 表单 map
键-值对 iex(13)> map = %{:a => 1, 2 => :b}%{2 => :b, :a => 1}iex(14)> map[:a]1iex(15) ...
- CSS 小结笔记之元素的隐藏与显示
在网站上经常会有一些需要一定操作才会显示或隐藏的元素,这时会用到元素的隐藏与显示.主要通过以下三种属性实现. 1.display :none|block |inline |inline-block d ...
- Sql Server tempdb原理-启动过程解析实践
我们知道在SqlServer实例启动过程中数据库会进行还原(Redo,Undo)然后打开提供服务,但我们知道tempdb是不提供重做机制的(Redo)那tempdb是如何还原的呢?如果tempdb损坏 ...
- sql建JOB语句
declare job_id pls_integer; begin sys.dbms_job.submit(job => job_id, what => 'proc_AGTAWBSTATI ...
- unwrapped与wrapped变量取值的问题
unwrapped与wrapped变量取值的问题 当我们在定义一个tableView时,是可以使用3种定义方式的,第一种就是定义成optional(AnyObject?)形式,第二种为non-opti ...
- Redis学习---Redis操作之Python连接
PyCharm下的Redis连接 连接方式: 1. 操作模式 redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使 ...
- 铁乐学python_day18-19_面向对象编程1
以下笔记绝大部分(百分之80或以上)摘自我的授课老师之一:老男孩教育中的景老师. 她上课讲的知识点由浅入深,引人入胜,听她的课完全不会感觉到困阿,而且不知不觉中就感觉掌握了. 她的博客是: http: ...
- 解决Failed to load the JNI shared library xxx/xxx/jvm.dll 错误
原因:jdk发生变化(新装了32位jdk),eclipse在启动时使用了 系统环境变量中的jdk路径(32位). 解决:只要把旧的64位的jre路径指定给eclipse启动文件即可. 在eclipse ...
- ZT 9种排序
9种排序 2012-09-19 14:58 66人阅读 评论(0) 收藏 编辑 删除 algorithmfpfilemergeintegerfloat [cpp] view plaincopy #in ...
- 使用 FRP 反向代理实现 Windows 远程连接
互联网普及率的日渐攀升与 IPv4 资源的持续减少,现在大部分家庭宽带都不会分配公网 IP ,这使一些网络应用的实现多了些困难,像个人的 NAS 和一些智能家居设备.对于分配公网 IP ,各地运营商的 ...