#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution
{
public:
int smallSum(vector<int>& nums)
{
if(nums.size()<2) return 0;
return guibing(nums,0,nums.size()-1);
}
private:
int guibing(vector<int>& nums,int L,int R)
{
if(L>=R) return 0;
int mid=L+((R-L)>>1);
return guibing(nums,L,mid)+guibing(nums,mid+1,R)+merger(nums,L,mid,R);
}
int merger(vector<int>& nums,int L,int mid,int R)
{
int result=0;
int i=L;
int j=mid+1;
vector<int> help;
while(i<=mid && j<=R)
{
if(nums[i]<nums[j])
{
result+=nums[i]*(R-j+1);
help.push_back(nums[i++]);
}else
{
help.push_back(nums[j++]);
}
}
while(i<=mid)
{
help.push_back(nums[i++]);
}
while(j<=R)
{
help.push_back(nums[j++]);
}
for(int i=0;i<help.size();i++)
{
nums[L+i]=help[i];
}
return result;
}
};
int main()
{
Solution ss;
int A[]={1,3,4,2,5};
int len=sizeof(A)/sizeof(*A);
vector<int> nums;
for(int i=0;i<len;i++)
{
nums.push_back(A[i]);
cout<<A[i]<<" ";
}
cout<<endl;
cout<<ss.smallSum(nums)<<endl;
for(int i=0;i<nums.size();i++)
{
cout<<nums[i]<<" ";
}
cout<<endl;
return 0;
}
#include <vector>
#include <algorithm>
using namespace std;
class Solution
{
public:
int smallSum(vector<int>& nums)
{
if(nums.size()<2) return 0;
return guibing(nums,0,nums.size()-1);
}
private:
int guibing(vector<int>& nums,int L,int R)
{
if(L>=R) return 0;
int mid=L+((R-L)>>1);
return guibing(nums,L,mid)+guibing(nums,mid+1,R)+merger(nums,L,mid,R);
}
int merger(vector<int>& nums,int L,int mid,int R)
{
int result=0;
int i=L;
int j=mid+1;
vector<int> help;
while(i<=mid && j<=R)
{
if(nums[i]<nums[j])
{
result+=nums[i]*(R-j+1);
help.push_back(nums[i++]);
}else
{
help.push_back(nums[j++]);
}
}
while(i<=mid)
{
help.push_back(nums[i++]);
}
while(j<=R)
{
help.push_back(nums[j++]);
}
for(int i=0;i<help.size();i++)
{
nums[L+i]=help[i];
}
return result;
}
};
int main()
{
Solution ss;
int A[]={1,3,4,2,5};
int len=sizeof(A)/sizeof(*A);
vector<int> nums;
for(int i=0;i<len;i++)
{
nums.push_back(A[i]);
cout<<A[i]<<" ";
}
cout<<endl;
cout<<ss.smallSum(nums)<<endl;
for(int i=0;i<nums.size();i++)
{
cout<<nums[i]<<" ";
}
cout<<endl;
return 0;
}