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分很好拿 然而我交了好几次才拿到......因为根本没看清题

subtask 2 我觉得很有趣

首先把差的平均数算出来 然后答案肯定大于这个平均数

这样就可以少管很多没用的数了

谁搞的hack数据......卡掉了我3分...

#include "gap.h"
#include<cstdio>
#include<algorithm>
#define M 200005
using namespace std;
long long a[M];
long long findGap(int T, int N)
{
    long long ans=0,head,tail;
    MinMax(0,(long long)1e18,&head,&tail);
    if(T==1)
    {
        a[1]=head;a[N]=tail;
        for(int i=2,j=N-1;i<=j;i++,j--)
        {
            MinMax(head+1,tail-1,&head,&tail);
            a[i]=head;a[j]=tail;
        }
        for(int i=1;i<N;i++)ans=max(ans,a[i+1]-a[i]);
        return ans;
    }
    else
    if(N==2)return tail-head;
    else
    {
        int t=0;
        long long ave=(tail-head-1)/N+1,begin=head,end=tail;
        a[++t]=begin;
        for(long long i=begin;i<end;i+=ave)
        {
         //   if(i+1<=min(i+ave,end-1))
            MinMax(i+1,min(i+ave,end-1),&head,&tail);
         //   else continue;
            if(head==-1 && tail==-1)continue;
            a[++t]=head;a[++t]=tail;
        }
        a[++t]=end;
        for(int i=1;i<t;i++)ans=max(ans,a[i+1]-a[i]);
        return ans;
    }
    return 0;
}

交互感觉还是很有趣的一种题型

有趣不代表会做......

明天APIO rp++ (这么晚了还不睡明天是要爆零了......)

时间: 2024-08-26 09:06:05

UOJ #206. 【APIO2016】Gap的相关文章

【APIO2016】Gap

[APIO2016]Gap 交互题 对于30%的数据,直接从s=0,t=1e18开始,每次让s=mn+1,t=mx-1,每一次可以得到两个,可以在(n+1)/2的时间内得到 对于其他数据,我们先求出最大最小值,求出len=(mx-mn)/(n-1),这相当与是一个"平均数",如果我将区间分为若干段长度为len的区间,只记录每个区间内的最大值和最小值,这样被漏算的那些点,他们最多有len-1的贡献,而这个还达不到平均数,所以肯定不会影响答案,所以就可以在3*n以内求出序列有用的部分了.

UOJ#204 【APIO2016】Boat

Time Limit: 70 Sec  Memory Limit: 256 MBSubmit: 559  Solved: 248 Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到.每个学校都 拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划艇颜色互不相同.颜色相同的划艇被认为是一 样的.每个学校可以选择派出一些划艇参加节日的庆典,也可以选择不派出任何划艇参加.如果编号为的学校选择 派出划艇参加庆典,那么,派出的划艇数量可

UOJ#122【NOI2013】树的计数

[NOI2013]树的计数 链接:http://uoj.ac/problem/122 按BFS序来,如果$B_i$与$B_{i-1}$必须在同一层,那么贡献为0,必须在不同层那么贡献为1,都可以贡献为0.5. 因为$B_i$与$B_{i-1}$相邻,所以对方案数的改变最多+1. 必须在不同层,即$D(B_{i-1})>D(B_i)$ 都可以,$B_i$能往下移一层,不改变BFS序以及DFS序: 作为兄弟,父亲必须一样(即$D(B_{i-1})==D(B_i)-1$),不然会改变DFS序. 作为儿

UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树

[NOI2015]荷马史诗 链接:http://uoj.ac/problem/130 因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树.第一问直接求解,第二问即第二关键字为树的高度. #include< cstdio > #include< algorithm > typedef unsigned long long ull; template inline void read(T&x) { x=0;bool f=0;char c=getchar(); while

UOJ#126【NOI2013】快餐店

[NOI2013]快餐店 链接:http://uoj.ac/problem/126 YY了一个线段树+类旋转卡壳的算法.骗了55分.还比不上$O(n^2)$暴力T^T 题目实际上是要找一条链的两个端点,链的中点处建快餐店.要求这两个端点的最短距离为其他所有点对的最短距离的最大值. 这条链不经过环,那答案就是环上挂的某个子树的子树直径.至少大于等于最大的树直径.树DP一发得到Ans1 经过环,显然不会饶环一圈.这个链必定由这样构成:x,y为环上两点.x子树最长链->x-y最短路-y子树最长链.可以

uoj #5. 【NOI2014】动物园 kmp

#5. [NOI2014]动物园 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/5 Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的园长决定开设算法班,让动物们学习算法. 某天,园长给动物们讲解KMP算法. 园长:“对于一个字符串S它的长度为L.我们可以在O(L)的时间内求出一个名为next

UOJ #2. 【NOI2014】起床困难综合症 数位DP

第二次做NOI的题... .预处理+数位DP #2. [NOI2014]起床困难综合症 id=2" style="">统计提交情况 id=2#tab-statement" style="color:rgb(85,85,85); text-decoration:none; position:relative; display:block; padding:10px 15px; margin-right:2px; line-height:1.428571

Uoj #131. 【NOI2015】品酒大会 后缀数组,并查集

#131. [NOI2015]品酒大会 统计 描述 提交 自定义测试 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainbow 调制了 nn 杯鸡尾酒.这 nn 杯鸡尾酒排成一行,其中第 ii 杯酒 (1≤i≤n1in) 被贴上了一个标签 sisi,每个标签都是 2626 个小写英文字母之一.设 Str(l,r)Strlr 表示第 ll 杯酒到第 rr 杯酒的 

UOJ #5. 【NOI2014】动物园 扩大KMP

第一次NOI称号. ... 扩展假设知道KMP如果. .. . 就是水题了. ... #5. [NOI2014]动物园 统计提交情况 描写叙述 提交 近日.园长发现动物园中好吃懒做的动物越来越多了.比如企鹅.仅仅会卖萌向游客要吃的. 为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的园长决定开设算法班.让动物们学习算法. 某天,园长给动物们解说KMP算法. 园长:"对于一个字符串S它的长度为L.我们能够在O(L)的时间内求出一个名为next的数组.有谁预习了next数组的含义吗?&