题目描述

有 $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. spring事务(Transaction )报 marked as rollback-only异常的原因及解决方法

    很多朋友在使用spring+hibernate或mybatis等框架时经常遇到报Transaction rolled back because it has been marked as rollba ...

  2. Running OOM killer script for process 32248 for Solr on port 8983

    Running OOM killer script for process 32248 for Solr on port 8983 分析1 https://blog.csdn.net/qq_41665 ...

  3. Docker容器技术的核心原理

    目录 1 前言 2 docker容器技术 2.1 隔离:Namespace 2.2 限制:Cgroup 2.3 rootfs 2.4 镜像分层 3 docker容器与虚拟机的对比 1 前言 上图是百度 ...

  4. hdu 5459

    Problem Description I've sent Fang Fang around 201314 text messages in almost 5 years. Why can't she ...

  5. virtual function c++

    之前一直不明白为什么要用虚函数,我只知道这样的规则, Base b = new derived(); b->do(); 调用的是子类的do(): virtue class只是一个虚拟的,调用的是 ...

  6. 《小团团团队》第九次团队作业:Beta冲刺与验收准备

    项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目验收 团队名称 小团团团队 作业学习目标 (1)掌握软件黑盒测试技术:(2)学 ...

  7. JS实现——俄罗斯方块

    把以下代码保存成Tetris.html文件,使用Google或360浏览器打开 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.0 Transit ...

  8. 十分钟了解socket

    socket通讯方式------socket是TCP/IP协议的网络数据通讯接口(一种底层的通讯的方式).socket是IP地址和端口号的组合.例如:192.168.1.100:8080 原理就是TC ...

  9. Leetcode1--->数组中两数之和等于给定数

    题目: 给定一个数组nums,目标数target.在数组中找到两数之和为target的数,返回两数的下标举例: Given nums = [2, 7, 11, 15], target = 9, Bec ...

  10. ef添加数据时出错 System.Data.Entity.Infrastructure.DbUpdateConcurrencyException”类型的异常

    找半天才找到 ef添加数据时出错原因:数据库表中没有主键 ,就算表中有自增列 Added方法也会报错: -        this._db.SaveChanges() “this._db.SaveCh ...