788. 逆序對的數量
阿新 • • 發佈:2020-09-19
題目描述
給定一個長度為n的整數數列,請你計算數列中的逆序對的數量。
逆序對的定義如下:對於數列的第i個和第j個元素,如果滿足i<j且a[i]>a[j],則其為一個逆序對;否則不是。
輸入格式
第一行包含整數n,表示數列的長度。
第二行包含n個整數,表示整個數列。
輸出格式
輸出一個整數,表示逆序對的個數。
資料範圍
1≤n≤100000
輸入樣例:
6
234561
輸出樣例:
5
思路
歸併排序
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 usingnamespace 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]) { 19 res+=p2-mid-1; 20 b[cnt++]=a[p1++]; 21 } 22 else b[cnt++]=a[p2++]; 23 } 24 while(p1<=mid) { 25 res+=r-mid; 26 b[cnt++]=a[p1++]; 27 } 28 while(p2<=r) b[cnt++]=a[p2++];29 for(int i=l; i<=r; i++) a[i]=b[i]; 30 } 31 32 int main() { 33 int n; 34 cin>>n; 35 for(int i=0; i<n; i++) cin>>a[i]; 36 mergeSort(0, n-1); 37 cout<<res<<endl; 38 return 0; 39 }