#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增加了该部分的逆序对数.