codeforces C. Theofanis‘ Nightmare

题意:大概把数组拆分成每个子数组,子数组如果有1-n个,求i*(子数组之和)。

思路:大概想到了应该尽量让最右边的正数拆分成单独一个,因为这样乘积会取最大。而且可以靠后缀和的方式来算子数组拆分之后的和。

但是想到了一个问题,如果出现1 1 1 -10000 -1 -1 1 1  这种情况怎么办,看了一下别的大佬的题解,大概理解了一下,就是把后缀和为负的数组塞在最左边,除非遇到了个比他更大的正数,就把他合并。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static Scanner cin=new Scanner(System.in);
    public static void main(String[] args) throws IOException {
        int t = cin.nextInt();
        while (t-- != 0) solve();
    }

    private static void solve() throws IOException {
        int n=cin.nextInt();
        int[] a=new int[n];
        for (int i = 0; i < n; i++) {
            a[i]= cin.nextInt();
        }
        Long sum=0L;
        Long ans=0L;
        for (int i=n-1;i>=0;i--)
        {
            sum+=a[i];
            if(sum>0||i==0)ans+=sum;
        }
        System.out.println(ans);
    }
}