问题转化:求单调和(小和)就是统计该元素前有多少小于等于该数的元素之和。问题和归并两个有序数组求小于等于该数的元素之和一样。所以现在的问题变为统计子问题中单调和。
// 当出现nums[i]<=nums[j]时,统计所有前半段区间内比nums[j]小的数
// 当前一个数组元素小于或等于后一个数组元素时,累加小和
// s[i] <= s[j] -> s[i] <= s[j]...s[right]
while (p1 <= mid && p2 <= right) {
if (a[p1] <= a[p2]){
//当出现nums[i]<=nums[j]时,统计所有前半段区间内比nums[j]小的数
// 当前一个数组元素小于或等于后一个数组元素时,累加小和
// s[i] <= s[j] -> s[i] <= s[j]...s[right]
res += a[p1] * (right - p2 + 1);
temp[k++] = a[p1++];
} else{
temp[k++] = a[p2++];
}
}