题目描述

有 $N$ 个严格递增的非负整数 $a_1, a_2, \dots, a_N$($0 \leq a_1 < a_2 < \cdots < a_N \leq 10^{18}$)。你需要找出 $a_{i + 1} - a_i$($0 \leq i \leq N - 1$)里的最大的值。

你的程序不能直接读入这个整数序列,但是你可以通过给定的函数来查询该序列的信息。关于查询函数的细节,请根据你所使用的语言,参考下面的实现细节部分。

你需要实现一个函数,该函数返回 $a_{i + 1} - a_i$($0 \leq i \leq N - 1$)中的最大值。

实现细节

本题只支持 C/C++/Pascal。

C/C++

你需要包含头文件 gap.h。

你需要实现一个函数 findGap(T, N),该函数接受下面的参数,并返回一个 long long 类型的整数:

  • $T$:子任务的编号($1$ 或者 $2$)
  • $N$:序列的长度

你的函数 findGap 可以调用系统提供的查询函数 MinMax(s, t, &mn, &mx),该函数的前两个参数 $s$ 和 $t$ 是 long long 类型的整数,后两个参数 &mn 和 &mx 是 long long 类型的整数的指针(mn 和 mx 是 long long 类型的整数)。当 MinMax(s, t, &mn, &mx) 返回时,变量 mn 将会存储满足 $a_i \in [s, t]$ 中 $a_i$ 的最小值,变量 mx 将会存储满足 $a_i \in [s, t]$,$a_i$ 的最大值。如果区间 $[s, t]$ 中没有序列中的数,则 mn 和 mx 都将存储 $-1$。在查询时需要满足 $s \leq t$,否则程序将会终止,该测试点计为 $0$ 分。

Pascal

你需要使用单元 graderhelperlib。

你需要实现一个函数 findGap(T, N),该函数接受下面的参数,并返回一个 Int64 类型的整数:

  • $T$:子任务的编号($1$ 或者 $2$)(Integer 类型)
  • $N$:序列的长度(LongInt 类型)

你的函数 findGap 可以调用系统提供的查询函数 MinMax(s, t, mn, mx),该函数的前两个参数 $s$ 和 $t$ 是 Int64 类型的整数,后两个参数 mn 和 mx 是传引用方式的 Int64 类型的整数(过程内部对这两个变量的修改会影响到外部的对应变量的值)。当 MinMax(s, t, mn, mx) 执行完毕时,变量 mn 将会存储满足 $a_i \in [s, t]$ 中 $a_i$ 的最小值,变量 mx 将会存储满足 $a_i \in [s, t]$,$a_i$ 的最大值。如果区间 $[s, t]$ 中没有序列中的数,则 mn 和 mx 都将存储 $-1$。在查询时需要满足 $s \leq t$,否则程序将会终止,该测试点计为 $0$ 分。

样例一

C/C++

考虑 $N = 4, a_1 = 2, a_2 = 3, a_3 = 6, a_4 = 8$。

则答案应该是 $3$,可以通过下面的几组对 MinMax 的询问获得:

  • 调用 MinMax(1, 2, &mn, &mx),则 mn 和 mx 皆返回 $2$。
  • 调用 MinMax(3, 7, &mn, &mx),则 mn 返回 $3$,mx 返回 $6$。
  • 调用 MinMax(8, 9, &mn, &mx),则 mn 和 mx 皆返回 $8$。

Pascal

考虑 $N = 4, a_1 = 2, a_2 = 3, a_3 = 6, a_4 = 8$。

则答案应该是 $3$,可以通过下面的几组对 MinMax 的询问获得:

  • 调用 MinMax(1, 2, mn, mx),则 mn 和 mx 皆返回 $2$。
  • 调用 MinMax(3, 7, mn, mx),则 mn 返回 $3$,mx 返回 $6$。
  • 调用 MinMax(8, 9, mn, mx),则 mn 和 mx 皆返回 $8$。

样例评测方式

样例测评系统从标准输入中读入两行。第一行包含两个整数,子任务编号 $T$,和序列长度 $N$。第二行包含 $N$ 个严格递增的非负整数。然后该程序会向标准输出中写入两行,第一行为 findGap 的返回值,第二行为花费 $M$ 的值。

下面的输入描述了上面的样例:

2 4
2 3 6 8

限制与约定

对于所有的测试点,有 $2 \leq N \leq 100000$。

每一个测试点开始测试之前,$M$ 都将被初始化为 $0$。

子任务 1(30 分):每一次调用 MinMax 都将使 $M$ 加 $1$。为了获得所有分数,需要满足对于该子任务下的所有测试点,都有 $M \leq \frac{N + 1}{2}$。

子任务 2(70 分):定义 $k$ 为调用 MinMax 时,区间 $[s, t]$ 中的序列中数的数量。每次调用 MinMax,将使 $M$ 加上 $k + 1$。对于每一个测试点,如果 $M \leq 3N$,你将得到 70 分,否则将得到 $\frac{60}{\sqrt{M/N + 1} - 1}$ 分。你的该子任务的得分是其下所有测试点中的最低分。

下载

样例及测评库下载


子任务1分析

这个比较简单

我们首先通过询问最大值和最小值得到这个序列的第一项和最后一项

然后依次缩小范围,可以整个序列,这样的询问次数恰好符合标准

然后我们只要用\(O(n)\)来得到相邻差的最大值即可

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<climits>
#include<string>
#include"gap.h"
#define LL long long
using namespace std;
const LL INF=1000000000000000000LL;
LL a[100010];
LL findGap(int T,int n)
{
if (T==1)
{
MinMax(0,INF,&a[1],&a[n]);
for (int i=2;i<=n/2;i++)
MinMax(a[i-1]+1,a[n-i+2]-1,&a[i],&a[n-i+1]);
LL x;
if (n%2==1) MinMax(a[n/2]+1,a[n/2+2]-1,&a[n/2+1],&x);
LL ans=a[2]-a[1];
for (int i=3;i<=n;i++)
ans=max(ans,a[i]-a[i-1]);
return ans;
}
else
{
}
}

子任务2分析

我们首先必须询问\([0,10^{18}]\),得到最小值\(x\),最大值\(y\),这次询问的代价为\(n+1\)

然后就需要用到一个数学技巧

设\(L=[\frac {(s1-t1)}{N}]\)(向上取整),显然最终的答案一定会大于等于平均值\(L\)

所以当我们只用关心区间内的最小值和最大值即可

这样我们一次询问长度为L的区间,理论上代价和为\(3n-1\),正好AC

不知道为什么,我的询问次数都是\(3n\),可能是我比较菜不过也能过QAQ

下面给出完整的代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<climits>
#include<string>
#include"gap.h"
#define LL long long
using namespace std;
const LL INF=1000000000000000000LL;
LL a[100010];
LL findGap(int T,int n)
{
if (T==1)
{
MinMax(0,INF,&a[1],&a[n]);
for (int i=2;i<=n/2;i++)
MinMax(a[i-1]+1,a[n-i+2]-1,&a[i],&a[n-i+1]);
LL x;
if (n%2==1) MinMax(a[n/2]+1,a[n/2+2]-1,&a[n/2+1],&x);
LL ans=a[2]-a[1];
for (int i=3;i<=n;i++)
ans=max(ans,a[i]-a[i-1]);
return ans;
}
else
{
LL l,x,y,MIN,MAX,p,ans;
MinMax(0,INF,&x,&y);
l=(y-x-1)/(n-1)+1;ans=0;p=x;
while (x<=y)
{
MinMax(x,x+l,&MIN,&MAX);
x+=l+1;
if (MIN!=-1) ans=max(ans,MIN-p),p=MAX;
}
ans=max(ans,MAX-MIN);
return ans;
}
}

【APIO2016】Gap的更多相关文章

  1. UOJ #206. 【APIO2016】Gap

    Description Solution 第一个子任务,直接从 \((a[i],a[j])\) 推出 \((a[i+1],a[j-1])\) 就行了,只需要 \(\frac{N+1}{2}\) 第二个 ...

  2. UOJ#206. 【APIO2016】Gap 构造 交互题

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ206.html 题解 T = 1 的情况直接大力从两边向中间询问即可. T = 2 的情况挺妙的,我没想到. 考虑首先花费 ...

  3. UOJ#206. 【APIO2016】Gap(交互,乱搞)

    描述 提交 自定义测试 有 NN 个严格递增的非负整数 a1,a2,…,aNa1,a2,…,aN(0≤a1<a2<⋯<aN≤10180≤a1<a2<⋯<aN≤101 ...

  4. UOJ #206. 【APIO2016】Gap【交互题】

    参考:https://blog.csdn.net/clover_hxy/article/details/70767653 人生第一次交互题...不是很难但是思维和传统题差别挺大的(以及并不会本地测试= ...

  5. 【APIO2016】Fireworks[DP 可并堆维护凸包优化]

    4585: [Apio2016]烟火表演 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 100  Solved: 66[Submit][Status] ...

  6. UOJ #205/BZOJ 4585 【APIO2016】Fireworks 可并堆+凸包优化Dp

    4585: [Apio2016]烟火表演 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 115  Solved: 79[Submit][Status] ...

  7. 【APIO2016】【UOJ205】【LOJ2568】烟花表演 可合并堆

    题目大意 有一棵树,每条边都有一个边权,现在你要修改边权,使得修改后根到所有叶子的距离相等. 要求所有边权非负. 修改的代价为\(\lvert\)每条边修改前的边权\(-\)修改后的边权\(\rver ...

  8. 【APIO2016】烟火表演

    题面 题解 神仙题目啊QwQ 设\(f_i(x)\)表示以第\(i\)个点为根的子树需要\(x\)秒引爆的代价. 我们发现,这个函数是一个下凸的一次分段函数. 考虑这个函数合并到父亲节点时会发生怎样的 ...

  9. BZOJ 4584 【APIO2016】 赛艇

    题目链接:赛艇 讲道理好好的Boat为啥要翻译成赛艇呢……题面中不也是划艇么…… 这道题考虑一下dp.由于划艇数量过于庞大,所以肯定不能直接记录到dp状态中.所以一个想法就是把数量离散化,然后把每个学 ...

随机推荐

  1. Solr 中的 docValues=true

    前言:  在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticsearch用户,无疑来说是一个福音,这玩意的出现通过牺牲一定的磁盘空间带来 ...

  2. IAR生成bin,HEX文件

    1.生成bin,hex文件 options->output converter->output format binary:.bin文件:intel extended:hex文件. 生成的 ...

  3. 天气API接口的使用

    最近项目中使用到了天气预报的功能,需要从网上获取天气数据,然后显示在公司系统的页面上. 在这里和大家分享下我的做法,希望能对大家有所帮助,如果有错误,欢迎大家指正. 先给大家看看效果: 下面开始进行讲 ...

  4. selenium2-元素管理方式及解析

    1.管理文件格式:yaml 2.Yaml里面的内容格式:   3.格式说明: baidu_input后面接上":",直接回车,然后空两格 type与value这两个key是固定 ...

  5. SPOJ COT2 Count on a tree II 树上莫队算法

    题意: 给出一棵\(n(n \leq 4 \times 10^4)\)个节点的树,每个节点上有个权值,和\(m(m \leq 10^5)\)个询问. 每次询问路径\(u \to v\)上有多少个权值不 ...

  6. HDU 5402 模拟 构造 Travelling Salesman Problem

    题意: 有一个n * m的数字矩阵,每个格子放着一个非负整数,从左上角走到右下角,每个格子最多走一次,问所经过的格子的最大权值之和是多少,并且输出一个路径. 分析: 如果n和m有一个是偶数的话,那么只 ...

  7. 【Shell】使用shell打印菜单,一键安装Web应用

    问题描述: [解答] [root@A04-Test- scripts]# more menu.sh #!/bin/bash echo "1.[install lamp]" echo ...

  8. day05 模块以及内置常用模块用法

    内置常用模块详解: 1 time 2 datetime 3 random   4 os 5 sys 6 shutil 7 shelve 8 xml 9 configparser 10 hashlib ...

  9. python-高级编程-05-异步IO

    [异步非阻塞IO] ------------------------------------------------------------------------------------------ ...

  10. 命令行客户端操作pg数据库常用操作

    登录 # su - postgres -c "psql" 或者 $psql -U user_name -d database_name -h serverhost psql (10 ...