题目要求枚举左右端点,求解出所有的区间和,这使得每个位置在区间中的贡献不同。例如,在样例1中,所有的子区间为 [1,1],[1,2],[1,3],[2,2],[2,3],[3,3]。其中,位置1贡献2次,位置2贡献4次,位置3贡献2次。题目要求最小化子区间和,因此需要让较大的数贡献较少的次数。将较大的数放在贡献次数少的位置,比如将2和3放在位置1和3,数字1放在贡献次数较多的位置2。最终数组排列结果为[2,1,3]或[3,1,2],最小值为19。
对于每个位置,统计其贡献次数,然后通过排序将数值大的数放置在贡献次数少的位置。对于位置i,包含i的区间[l,r]满足l≤i≤r,因此有0≤l≤i,i≤r<n。位置i的贡献次数nums[i]为(i+1)×(n−i)。最小的贡献即为排序后的每个数乘以对应的贡献次数:
∑arr[i]×nums[i]小红有一个长度为n的数组a,他定义了一个函数f:f(l,r)=∑k=lrak,即f(l,r)表示数组a在[l,r]这一段区间的区间和。
现在小红有一个重新任意排列数组a的机会,他想要最小化∑l=1n∑r=lnf(l,r),即最小化所有区间对于f的值之和,请你帮他算算最小的这个值吧。
第一行输入一个正整数n(1≤n≤2×105)代表数组中元素的个数。
第二行输入n个整数a1,a2,......,an(1≤ai≤105)代表数组中的元素。
在一行上输出一个整数,表示题中所求答案。
输入
3
1 2 3
输出
19
说明
重新排列为{1,2,3},此时全部区间为[2]、[1]、[3]、[2,1]、[1,3]和[2,1,3]总和恰好为19,可以证明这是最小的。
输入
6
1 1 4 5 1 4
输出
128