#include <unordered_map>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
long long GetInversePairs(vector<int>& nums, int left_boundry, int right_boundry) {
if (left_boundry == right_boundry || right_boundry - left_boundry == 1) return 0;
int mid = (left_boundry + right_boundry) / 2;
long long left_ans = GetInversePairs(nums, left_boundry, mid);
long long right_ans = GetInversePairs(nums, mid, right_boundry);
int left_it = left_boundry;
int right_it = mid;
long long ans = left_ans + right_ans;
vector<int> new_nums;
new_nums.reserve(right_boundry - left_boundry);
while(left_it != mid && right_it != right_boundry) {
int left_val = nums[left_it];
int right_val = nums[right_it];
if (left_val <= right_val) {
new_nums.push_back(nums[left_it++]);
} else {
ans += mid - left_it;
new_nums.push_back(nums[right_it++]);
}
}
while(left_it != mid) {
new_nums.push_back(nums[left_it++]);
}
while(right_it != right_boundry) {
new_nums.push_back(nums[right_it++]);
}
for (int i = left_boundry; i < right_boundry; ++i) {
nums[i] = new_nums[i - left_boundry];
}
cout << left_boundry << " " << right_boundry << " " << ans << endl;
return ans;
}
int InversePairs(vector<int>& nums) {
// write code here
return GetInversePairs(nums, 0, nums.size()) % 1000000007;
}
};