1 条题解
-
0
📝 题目大意
给定一个长度为 的数组 ,要求构造一个长度为 的数组 ,使得 的前缀和等于 的对应元素,即 ()。题目保证解存在且唯一。
💡 解题思路
-
题目分析:
- ,数据范围极小,但 可达到 级别,需使用
long long。 - 核心条件: 的前缀和等于 ,即 。
- ,数据范围极小,但 可达到 级别,需使用
-
算法推导:
- 当 时,,这是唯一确定的。
- 当 时,由前缀和定义可得:$$S_k = A_1 + A_2 + \cdots + A_{k-1} + A_k = S_{k-1} + A_k$$
- 移项得:。
- 因此只需要遍历 从 到 ,每次计算 并输出即可。
- 代码中先将 存入变量
q并直接输出(即 ),随后循环读入 ,用差分 计算 。
-
边界与细节:
- 可能为负数, 也可能为负数,使用
long long避免溢出。 - 输出时每个元素后跟一个空格,末尾多余空格在本题中不影响评测。
- 可能为负数, 也可能为负数,使用
⏱️ 复杂度分析
- 时间复杂度:,只需一次遍历。
- 空间复杂度:,存储数组 和 (实际上可优化为 ,但 很小无必要)。
💻 标准代码 (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
- 上传者