1. 程式人生 > 實用技巧 >788. 逆序對的數量

788. 逆序對的數量

題目描述

給定一個長度為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 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]) { 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 }