788. 逆序对的数量

题目描述

给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。

逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。

输入格式

第一行包含整数n,表示数列的长度。

第二行包含 n 个整数,表示整个数列。

输出格式

输出一个整数,表示逆序对的个数。

数据范围

1≤n≤100000

输入样例:

6
2 3 4 5 6 1

输出样例:

5

思路

  归并排序

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 using namespace std;
 5 typedef long long ll;
 6 const int max_n=1e5+5;
 7 
 8 int a[max_n], b[max_n];
 9 ll res=0;
10 
11 void mergeSort(int l, int r) {
12     if(l>=r) return;
13     int mid=l+r >> 1;
14     mergeSort(l, mid);
15     mergeSort(mid+1, r);
16     int p1=l, p2=mid+1, cnt=l;
17     while(p1<=mid && p2<=r) {
18         if(a[p1]<=a[p2]) b[cnt++]=a[p1++];
19         else {
20             res+=mid-p1+1;
21             b[cnt++]=a[p2++];
22         }
23     }
24     while(p1<=mid) b[cnt++]=a[p1++];
25     while(p2<=r) b[cnt++]=a[p2++];
26     for(int i=l; i<=r; i++) a[i]=b[i];
27 }
28 
29 int main() {
30     int n;
31     cin>>n;
32     for(int i=0; i<n; i++) cin>>a[i];
33     mergeSort(0, n-1);
34     cout<<res<<endl;
35     return 0;
36 }
原文地址:https://www.cnblogs.com/wwqzbl/p/13695337.html