1 条题解

  • 0
    @ 2025-8-24 22:55:01

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar jokiii
    ·

    搬运于2025-08-24 22:55:01,当前版本为作者最后更新于2024-01-27 21:41:06,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    前言:第一眼看到题在一个给定序列上加上一个等差数列就觉的和这题有点类似,但发现首项和公差均为 11 且结束点一定为 nn 便发现了有蹊跷。


    • 题意:给定数组 aa,可以在任意位置 ii 加上(或减去)一个首项为 11,公差为 11,长度为 ni+1n-i+1(即结束点为 nn)的等差数列。问需要加(或减)几个等差数列可使 aa 中的值全为 00

    此题正解应为:二阶差分

    观察到

    等差数列 1 2 3 4 5
    差分一次 1 1
    差分两次 0

    可得结论:在差分两次后的数组的 ii 位置上加 11,就等价于在原数组 iinn 上加上了一个首项为 11 公差为 11 的等差数列。

    所以,数组 aa 两次差分后所有数的绝对值的和,即为将原数列应加上等差数列的个数。

    代码如下

    #include <iostream>
    #include <cmath>
    using namespace std;
    long long n,a[200010],s[200010],s2[200010],ans;
    //别忘了long long
    int main(){
        cin>>n;
        for(int i = 1;i<=n;i++){
            cin>>a[i];
            s[i]=a[i]-a[i-1];
            s2[i]=s[i]-s[i-1];
            ans+=abs(s2[i]);
        }
        cout<<ans;
    }
    
    
    • 1

    信息

    ID
    9699
    时间
    2000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者