现定义数组单调和为所有元素i的f(i)值之和。这里的f(i)函数定义为元素i左边(不包括其自身)小于等于它的数字之和。请设计一个高效算法,计算数组的单调和。
给定一个数组A同时给定数组的大小n,请返回数组的单调和。保证数组大小小于等于500,同时保证单调和不会超过int范围。
测试样例:
[1,3,5,2,4,6],6
返回:27
class MonoSum {
public:
int res=0;
int calcMonoSum(vector<int> A, int n) {
// write code here
int len=A.size()-1;
MergeSort(A,0,len);
return res;
}
void MergeSort(vector<int> &A,int start,int end){
if(start<end){
int mid=(start+end)/2;
MergeSort(A,start,mid);
MergeSort(A,mid+1,end);
Merge(A,start,mid,end);
}
}
void Merge(vector<int>&A,int start,int mid,int end ){
vector<int> tmp(A.size(),0);
for(int i=0;i<A.size();i++){
tmp[i]=A[i];
}
int i,j,k;
for(i=start,j=mid+1,k=start;i<=mid&&j<=end;k++){
if(tmp[i]<=tmp[j]){
res+=tmp[i]*(end-j+1);
A[k]=tmp[i++];
}
else{
A[k]=tmp[j++];
}
}
while(i<=mid){
A[k++]=tmp[i++];
}
while(j<=end){
A[k++]=tmp[j++];
}
}
};