题目要求枚举左右端点,求解出所有的区间和,这使得每个位置在区间中的贡献不同。例如,当 n=3 时,所有的子区间为 [1,1],[1,2],[1,3],[2,2],[2,3],[3,3]。其中,位置1贡献2次,位置2贡献4次,位置3贡献2次。题目要求最小化总代价,因此需要让较大的数贡献较少的次数。将较大的数放在贡献次数少的位置,比如将较大的数放在位置1和3,较小的数放在贡献次数较多的位置2。
对于每个位置,统计其贡献次数,然后通过排序将数值大的数放置在贡献次数少的位置。对于位置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 个正整数,你需要将它们排列成一个序列 b1,b2,…,bn。 对于任意满足 1≤l≤r≤n 的下标对 (l,r),定义 S(l,r)=bl+bl+1+⋯+br,即从第 l 个位置到第 r 个位置的连续段和。 该序列的总代价定义为所有可能段的和的总和:∑l=1n∑r=lnS(l,r)。 你需要计算通过重新排列 n 个整数所能达到的最小总代价。
数据范围:n 不超过 2×105,每个整数 ai 不超过 105。
第一行包含一个整数 n (1≤n≤2×105),表示整数的个数。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册