#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 2020-11-29 22:21  Riverlll  阅读(65)  评论(0)    收藏  举报