zoukankan      html  css  js  c++  java
  • UOJ #206. 【APIO2016】Gap

    有 NN 个严格递增的非负整数 a1,a2,,aNa1,a2,…,aN(0a1<a2<<aN10180≤a1<a2<⋯<aN≤1018)。你需要找出 ai+1aiai+1−ai(0iN10≤i≤N−1)里的最大的值。

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

    你需要实现一个函数,该函数返回 ai+1aiai+1−ai(0iN10≤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。在查询时需要满足 sts≤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。在查询时需要满足 sts≤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
    
    

    限制与约定

    对于所有的测试点,有 2N1000002≤N≤100000。

    每一个测试点开始测试之前,MM 都将被初始化为 00。

    子任务 1(30 分):每一次调用 MinMax 都将使 MM 加 11。为了获得所有分数,需要满足对于该子任务下的所有测试点,都有 MN+12M≤N+12。

    子任务 2(70 分):定义 kk 为调用 MinMax 时,区间 [s,t][s,t] 中的序列中数的数量。每次调用 MinMax,将使 MM 加上 k+1k+1。对于每一个测试点,如果 M3NM≤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++ (这么晚了还不睡明天是要爆零了......)

  • 相关阅读:
    【ybtoj】【Hash】回文子串
    Design Pattern:状态模式
    Design Pattern:装饰者模式
    Design Pattern:外观模式
    Design Pattern:适配器模式
    Design Pattern:模板方法模式
    Design Pattern:命令模式
    Design Pattern:观察者模式
    Design Pattern:复合模式
    Design Pattern:迭代器模式
  • 原文地址:https://www.cnblogs.com/fdfzhyf/p/6847888.html
Copyright © 2011-2022 走看看