题记:归并排序的模板题。
typedef long long ll;
const int N=5e4+10;
int tmp[N];
class Solution {
public:
ll merge_sort(int l,int r,vector<int> &nums){
if(l>=r) return 0;
int mid=(l+r)>>1;
ll cnt=merge_sort(l,mid,nums)+merge_sort(mid+1,r,nums);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r){
if(nums[i]<=nums[j])
tmp[k++]=nums[i++];
else{
tmp[k++]=nums[j++];
cnt+=mid-i+1;
}
}
while(i<=mid) tmp[k++]=nums[i++];
while(j<=r) tmp[k++]=nums[j++];
for(int i=l,j=0;i<=r;i++,j++)
nums[i]=tmp[j];
return cnt;
}
int reversePairs(vector<int>& nums) {
int l=0,r=nums.size()-1;
return merge_sort(l,r,nums);
}
};