#include<cstdio>using namespace std ;int a [ 100001 ], r [ 100001 ], n , i ;long long sum = 0 ;
void mergesort ( int s , int m , int t ){int l , j , k ;if ( s == t )return ;i = s ;j = m + 1 ;k = s ;while ( i <= m && j <= t )if ( a [ i ] <= a [ j ]){r [ k ] = a [ i ];i ++ ;k ++ ;}else{r [ k ] = a [ j ];j ++ ;k ++ ;sum += m - i + 1 ;}while ( i <= m ){r [ k ] = a [ i ];i ++ ;k ++ ;}while ( j <= t ){r [ k ] = a [ j ];j ++ ;k ++ ;}for ( i = s ; i <= t ; i ++ )a [ i ] = r [ i ];}
void merge ( int l , int r ){int m = ( l + r ) / 2 ;if ( l < r ){merge ( l , m );merge ( m + 1 , r );mergesort ( l , m , r );}}
int main (){scanf ( "%d" , & n );for ( i = 1 ; i <= n ; i ++ )scanf ( "%d" , & a [ i ]);merge ( 1 , n );printf ( "%lld" , sum );return 0 ;}
归并排序求逆序对
最新推荐文章于 2024-04-21 03:39:53 发布