题目大意:一个从1开始编号的数组的不完美度为,现在可以将数组分成两个从1开始编号的数组,请问分成的两个数组的不完美度之和最小是多少?

将一个数组分成两半,左半边的不完美度的没有任何变化的。

右半部分,假设是从i开始,区间是[i, n]:
第i个元素由a[i]i变成了a[i]*1,第i+1个元素由a[i+1](i+1)变成了a[i+1]2,第j个元素由a[j]*j变成了a[j](j-i+1)……
即这个区间多有元素都少加了i-1次!

枚举端口位置i,右边区间之和乘以i-1即可以减去的不完美度。

注意,整个区间加起来,极端情况下是1e51e51e9/2,约5e18,好像没爆long long。

#include <bits/stdc++.h>
#define LL long long
#define N 100005
using namespace std;
LL n, m, i, j, k, a[N], s[N];
int main(){
    scanf("%lld", &n);
    for(i=1; i<=n; i++){
        scanf("%lld", &a[i]);
        s[i] = s[i-1] + a[i];
    }
    for(i=1; i<=n; i++){
        m = max(m, (s[n]-s[i-1]) * (i-1));
    }
    for(m=-m, i=1; i<=n; i++){
        m += a[i] * i;
    }
    printf("%lld\n", m);
    return 0;
}