[模板]求逆序对数

题目在此.

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int n, s[500010], tmp[500010];
long long ct;

void merge(int l, int r){
    if(l == r) return;
    int mid = l + r >> 1;
    merge(l, mid);
    merge(mid + 1, r);
    int i = l, j = mid + 1;
    for(int k = l; k <= r; k++)
        if(j > r || i <= mid && s[i] <= s[j]) tmp[k] = s[i++];
        else tmp[k] = s[j++], ct += mid - i + 1;
    for(int k = l; k <= r; k++) s[k] = tmp[k];
}

int main(){
    // freopen("in.txt", "r", stdin);
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", s + i);

    merge(1, n);

    printf("%lld
", ct);

    return 0;
}

merge函数讲数组s的[l,r]部分归并排序,并将全局变量ct增加了该部分的逆序对数.

原文地址:https://www.cnblogs.com/Gaomez/p/14251385.html