时间限制:1秒
空间限制:65536K
热度指数:140126
算法知识视频讲解
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
示例1
输入
1,2,3,4,5,6,7,0
输出
7
class Solution {
public:
const int mod=1000000007;
int ans=0;
int InversePairs(vector<int> data) {
Merge_sort(0,data.size()-1,data);
return ans;
}
void Merge_sort(int l,int r,vector<int> &data){
if(l<r){
int mid=(l+r)>>1;
Merge_sort(l,mid,data);
Merge_sort(mid+1,r,data);
Union(l,r,data);
}
return ;
}
void Union(int l,int r,vector<int>& data){
int mid=(l+r)>>1;
vector<int> tmp;
int ll=l,rr=mid+1;
while(ll<=mid&&rr<=r){
if(data[ll]<data[rr]){
tmp.push_back(data[ll++]);
}
else{
tmp.push_back(data[rr++]);
ans+=(mid-ll+1);
ans%=mod;
}
}
while(ll<=mid)
tmp.push_back(data[ll++]);
while(rr<=r)
tmp.push_back(data[rr++]);
for(int i=l;i<=r;i++)
data[i]=tmp[i-l];
return ;
}
};