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);
}
}