归并分治模板

翻转对

class Solution {
public:
    int findpairs(vector<int> &nums, int l, int r) {
        int mid = (l + r) >> 1;
        int i = l, j = mid + 1;
        int res = 0;
        for (; i <= mid; ++i) {
            while (j <= r && (1LL * nums[i] > 2LL * nums[j])) {
                res += mid - i + 1;
                ++j;
            }
        }
        return res;
    }

    int merge(vector<int> &nums, int nums2[], int l, int r) {
        if (l >= r) return 0;
        int res = 0;
        int mid = (l + r) >> 1;
        res = merge(nums, nums2, l, mid) + merge(nums, nums2, mid + 1, r) + findpairs(nums, l, r);

        int i = l, j = mid + 1;
        int id = l;
        while (i <= mid && j <= r ) {
            if (nums[i] <= nums[j]) nums2[id++] = nums[i++];
            else nums2[id++] = nums[j++];
        }


        while (i <= mid) nums2[id++] = nums[i++];
        while (j <= r) nums2[id++] = nums[j++];
        for(int ind = l;ind <= r;ind++) nums[ind] = nums2[ind];
    
        return res;
    }


    int reversePairs(vector<int>& nums) {
        int n = nums.size();
        int nums2[n];
        if (n == 0) return 0;
        return merge(nums, nums2, 0, n - 1);
    }
};

小和问题

#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define ll long long

int a[maxn];
int b[maxn];

ll find(int a[], int l, int r) {
    if (l == r) return 0;
    int mid = (l + r) >> 1;
    int i = l, j = mid + 1;
    ll res = 0;
    for (; j <= r; ++j) {
        while (i <= mid && a[i] <= a[j]) {
            res += 1LL * (r - j + 1) * a[i];
            i++;
        }
    }
    return res;
}


ll merge(int a[], int b[], int l, int r) {
    if (l >= r) return 0;
    int mid = (l + r) >> 1;
    int i = l, j = mid + 1, k = l;
    ll res = merge(a, b, l, mid) + merge(a, b, mid + 1, r) + find(a, l, r);
    while (i <= mid && j <= r) {
        if (a[i] <= a[j]) b[k++] = a[i++];
        else b[k++] = a[j++];
    }
    while (i <= mid) b[k++] = a[i++];
    while (j <= r) b[k++] = a[j++];

    for (int i = l; i < k; ++i) a[i] = b[i];
    return res;
}

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) cin >> a[i];
    cout << merge(a, b, 0, n - 1);
    return 0;
}
posted @ 2025-12-07 14:46  Wuyou2008  阅读(6)  评论(0)    收藏  举报