题目描述
给定一个长度为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 }