题目描述
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
输入例子:
1,2,3,4,5,6,7,0
输出例子:
7
分析
假如写出归并排序的过程后,该方法只需要在归并排序中添加记录总数的一句话就行。
代码实现
int InversePairs(vector<int> a) {
long long total_pairs = 0;
vector<int> temp(a);
mergeSort( a, temp, 0, a.size()-1 , total_pairs);
return total_pairs%1000000007 ;
}
void merge(vector<int>&a,vector<int>&temp, int start,int mid,int end ,long long & total_pairs){
int i = start;
int j = mid+1; ///参照两个数的情况,j不能取mid
int ind = start;
while(i<=mid && j<=end){
if(a[i] <= a[j] ){
temp[ind++]= a[j++];
}
else{
temp[ind++]= a[i++];
total_pairs+= (end-j+1);
}
}
for(int k = i;k<=mid ;k++){
temp[ind++]= a[k];
}
for(int k = j;k<=end;k++)
temp[ind++]= a[k];
for(int k =start;k<=end;k++){
a[k]=temp[k];
}
}
void mergeSort(vector<int>&a,vector<int>&temp,int start,int end ,long long & total_pairs){
int n = a.size();
if(n<=0)
return ;
if(start<end){
int mid = (start + end)/2;
mergeSort( a, temp, start, mid ,total_pairs);
mergeSort( a, temp, mid+1, end ,total_pairs);
merge( a, temp, start, mid, end ,total_pairs);
}
}