1 条题解
-
0
#include <bits/stdc++.h> using namespace std; #define int long long void solve(){ /* 这道题题意挺明白的,我们来考虑一下每次分段的性质。 我们可以发现每次分段的时候,分段的地方之前的答案没有变化,变化的只是之后的答案。 每次分段会使段数增加一个,也就使后面的所有段的排号(每一段的总和乘上的那个数)都会增加一。 与之前的式子相比较,整个式子的答案相当于增加了分段的地方的后缀和。 所以这道题分段的地方就是所有后缀和为正数的地方,答案便是原数列和加上每次分段的后缀和的总值。 */ int n; cin >> n; int ans = 0; int a[n+1] = {0}; for(int i = 1; i <= n; i++){ cin >> a[i]; ans += a[i]; } int sum = 0; for(int i = n; i >= 2; i--){ sum += a[i]; if(sum > 0){ ans += sum; } } cout << ans << endl; } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int T=1; cin >> T; while(T--){ solve(); } return 0; }
- 1
信息
- ID
- 1187
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 14
- 已通过
- 9
- 上传者