1 条题解

  • 0
    @ 2025-11-8 19:59:18
    #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
    上传者