
#include<iostream> #include<iomanip> #include <algorithm> #include <bitset> #include <list> #include <map> #include <queue> #include <set> #include <stack> #include<unordered_map> using namespace std; void print(vector<int>& nums) { for (auto i : nums) { cout << i << ' '; } cout << endl; } int mergeSortRecursive(vector<int>& nums, int left, int right) { if (left == right) { return 0; } int mid = (left + right) / 2; int res = mergeSortRecursive(nums, left, mid) + mergeSortRecursive(nums, mid + 1, right); //cout << left << ' ' << right << endl; int i = left, j = mid + 1; while (i <= mid) { while (j <= right && 2 * (long long)nums[j] < (long long)nums[i]) { j++; } res += (j - mid - 1); i++; } vector<int> tmp(right - left + 1); i = left; j = mid + 1; int loop = 0; while (i <= mid&&j<=right) { if (nums[i] < nums[j]) { tmp[loop++] = nums[i++]; } else { tmp[loop++] = nums[j++]; } } while (i <= mid) { tmp[loop++] = nums[i++]; } while (j <= right) { tmp[loop++] = nums[j++]; } for (i = 0; i < tmp.size(); ++i) { nums[left + i] = tmp[i]; } return res; } int reversePairs(vector<int>& nums) { if (nums.size() <= 1) { return 0; } return mergeSortRecursive(nums, 0, nums.size() - 1); } int main() { vector<int> nums = { 1, 3, 2, 3, 1 }; cout << reversePairs(nums) << endl; print(nums); }
posted on
浙公网安备 33010602011771号