1 条题解

  • 0
    @ 2026-6-19 10:30:21

    📝 题目大意

    给定一个长度为 NN 的数组 SS,要求构造一个长度为 NN 的数组 AA,使得 AA 的前缀和等于 SS 的对应元素,即 j=1kAj=Sk\sum_{j=1}^{k} A_j = S_k1kN1 \le k \le N)。题目保证解存在且唯一。

    💡 解题思路

    1. 题目分析

      • N10N \le 10,数据范围极小,但 SiS_i 可达到 10910^9 级别,需使用 long long
      • 核心条件:AA 的前缀和等于 SS,即 A1+A2++Ak=SkA_1 + A_2 + \cdots + A_k = S_k
    2. 算法推导

      • k=1k=1 时,A1=S1A_1 = S_1,这是唯一确定的。
      • k2k \ge 2 时,由前缀和定义可得:$$S_k = A_1 + A_2 + \cdots + A_{k-1} + A_k = S_{k-1} + A_k$$
      • 移项得:Ak=SkSk1A_k = S_k - S_{k-1}
      • 因此只需要遍历 ii22NN,每次计算 Ai=SiSi1A_i = S_i - S_{i-1} 并输出即可。
      • 代码中先将 S1S_1 存入变量 q 并直接输出(即 A1A_1),随后循环读入 SiS_i,用差分 SiSi1S_i - S_{i-1} 计算 AiA_i
    3. 边界与细节

      • SiS_i 可能为负数,AiA_i 也可能为负数,使用 long long 避免溢出。
      • 输出时每个元素后跟一个空格,末尾多余空格在本题中不影响评测。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),只需一次遍历。
    • 空间复杂度O(N)O(N),存储数组 SSAA(实际上可优化为 O(1)O(1),但 NN 很小无必要)。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        long long int n, q;
        cin >> n;
        long long int s[n + 1], a[n + 1] = {0};
        // 读入 S_1,它就是 A_1
        cin >> q;
        cout << q << " ";           // 输出 A_1 = S_1
        for (long long int i = 2; i <= n; i++) {
            cin >> s[i];
            s[1] = q;               // 将 S_1 存入 s[1](供差分使用)
            a[i] = s[i] - s[i - 1]; // 差分公式:A_i = S_i - S_{i-1}
            cout << a[i] << " ";    // 输出 A_i
        }
        return 0;
    }
    
    • 1

    信息

    ID
    658
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者