1 条题解

  • 0
    @ 2025-8-24 23:06:31

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar xiaohuli113
    **

    搬运于2025-08-24 23:06:31,当前版本为作者最后更新于2025-02-02 20:23:55,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    序列 AA 中各个数字之间的差都与差分序列 DD 的每一个数字对应,并且序列 AA 的长度为 NN。值得注意的是,序列 AA 的数据范围为 1AiN1 \leq A_i \leq N。所以,序列 AA 中的每一个数字都应该为正整数。题意就是给出序列 DD,求序列 AA,可以考虑模拟。

    对于序列 AA 的初始值,可以选择 11,这样相对更方便,那么 A1A_{1} 的值为 11。同理,可以得出 Ai=Ai1+Di1A_{i} = A_{i-1} + D_{i-1}

    那么如何判断求出的序列是否唯一呢?我们知道,序列 AA 的数据范围为 1AiN1 \leq A_i \leq N。这就意味着,如果要让序列是唯一的,那么 11NN 中的所有数字都必须和序列 AA 中的所有数字相匹配。这样的话,如果让序列 AA 中的所有数字都减去或加上 11 以达到它们之间的差与序列 DD 相匹配是不可能的。因为如果序列中的最大值或最小值超出了指定范围,那么得到的序列当然与条件不符。

    说简单点,如果序列 AA 的最大值与最小值的差等于 11NN 的差,那么该序列唯一。如果不符合这个条件,那么就不是唯一的。至于找一段数列里最小值和最大值的求法,这里就不细说了,毕竟最简单的方法就是进行比较。

    最后,如果得出的最小值是非正数怎么处理呢?如果是非正数,那让它变成正数就好了。我们假设最小值 minnminn,如果想让所有数字的值变成 11,最快的方式就是让它们加上 1minn1 - minn

    #include<bits/stdc++.h>
    using namespace std;
    int n,d[300050],a[300050];
    long long int maxn=1,minn=1;
    int main(){
        a[1]=1;//初始值 
        scanf("%d",&n);
        for(int i=1;i<n;i++)scanf("%d",&d[i]);
        for(int i=2;i<=n;i++){
            a[i]=a[i-1]+d[i-1];//计算序列A中每个数字的值 
            if(a[i]<minn)minn=a[i];
            if(a[i]>maxn)maxn=a[i];//通过比较算最大最小值 
        }
        int c=maxn-minn;//最大值和最小值的差 
        if(c!=n-1)printf("-1");
        else{
    		for(int i=1;i<=n;i++)printf("%d ",a[i]+1-minn);//让非正数变为正数
    	}
        return 0;
    }
    
    • 1

    信息

    ID
    11004
    时间
    1000ms
    内存
    1024MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者