Acwing.788.逆序对的数量

133 阅读1分钟

www.acwing.com/problem/con…

本题的主要思路是,在归并排序的回溯过程中进行逆序对的统计。因为在回溯的过程中,A[l...p]和A[p...r]分别都是有序的,所以在A[l...p]中的元素x比A[p...r]中的某个元素y大时,x...p的元素都比y大。举个例子:

#include <cstdio>
using namespace std;

const int N = 100010;

int n;
long long res = 0;
int arr[N];

void getAns(int left, int right) {
    if(left >= right) return;
    
    int mid = left + ((right - left) >> 1);
    getAns(left, mid);
    getAns(mid + 1, right);
    int tmp[right - left + 1];
    
    int i = left, j = mid + 1, idx = 0;
    while(i <= mid && j <= right) {
        if(arr[i] > arr[j]) {
            res += (mid - i + 1);
            tmp[idx++] = arr[j++];
        } else
            tmp[idx++] = arr[i++];
    }
    
    while(i <= mid) tmp[idx++] = arr[i++];
    while(j <= right) tmp[idx++] = arr[j++];
    
    for(int x = left; x <= right; ++x) arr[x] = tmp[x - left];
}

int main() {
    scanf("%d", &n);
    for(int i = 0; i < n; ++i) scanf("%d", &arr[i]);
    
    getAns(0, n-1);
    
    printf("%ld\n", res);
    return 0;
}