class Solution { public: const int P = 1000000007; int merge(vector<int> &data, int l, int r){ //y总的归并排序 if(l >= r) return 0; //一个数 直接返回 int mid = (l + r) >> 1; int res = merge(data, l, mid) + merge(data, mid + 1, r); //两个子区间内部先找 int i = l , j = mid + 1; vector<int> temp; //记录当前大区间内部的归并结果 while(i <= mid && j <= r){ if(data[i] <= data[j]) temp.push_back(data[i ++]); else { temp.push_back(data[j ++]); res += mid - i + 1; //两个字区间之间找,这两个子区间已经各自有序 if(res >= P) res %= P; } } while(i <= mid) temp.push_back(data[i ++]); //对于另一个没遍历完的子区间,直接排到后面 while(j <= r) temp.push_back(data[j ++]); i = l; for(auto x : temp) data[i ++] = x; //temp放回原来的归并序列,本次归并完成 return res; } int InversePairs(vector<int> data) { return merge(data, 0, data.size()-1); } };