问题描述:有一组数,每个数的左边如果有比自己小的数,则这个数要加入到左子和中。
比如{3,2,5,4,6,9}
5左边3+2,4左边3+2,6左边3+2+5+4,9左边3+2+5+4+6,左子和总大小为44
(同理问题:每个数右边比自己小的数可以组成降序组,问有多少个降序组)
用堆排序的思想来做
代码只需要修改合并代码中的while()中的一部分即可
int mergearray(int a[],int left,int mid,int right){
int help[right-left+1];
int i=0;
int sum=0;
int p1=left;
int p2=mid+1;
while(p1<=mid&&p2<=right){
sum+=a[p1]<a[p2]?(right-p2+1)*a[p1]:0;
help[i++]=a[p1]<a[p2]?a[p1++]:a[p2++];
}
while(p1<=mid){
help[i++]=a[p1++];
}
while(p2<=right){
help[i++]=a[p2++];
}
for(i=0;i<right-left+1;i++){
a[left+i]=help[i];
}
return sum;
}
int mergesortsum(int a[],int left,int right){
if(left==right)
return 0;
int mid=(left+right)/2;
return mergesortsum(a,left,mid)+mergesortsum(a,mid+1,right)+mergearray(a,left,mid,right);
//注意这里的递归顺序是 先左右后中间 ,递归顺序一定不能错。
}