归并排序逆序对短小代码



typedef long long LL ;

const int Max_N = 500008 ;
int  x[Max_N] ;
LL  bigger[32] ;

void Divide(int L , int R , int dep){
     if(L == R)  return ;
     int M = (L + R) >> 1 ;
     Divide(L , M , dep+1) ;
     Divide(M+1 , R , dep+1) ;
     for(int i = M+1 ; i <= R ; i++)
        bigger[dep] += (LL)((x + M + 1) - upper_bound(x+L , x+M+1 , x[i]));
     sort(x+L , x+R+1) ;
}

int main(){
    int n , i ;
    LL ans ;
    while(cin>>n && n){
         for(i = 1 ; i <= n ; i++)
             scanf("%d" ,&x[i]) ;
         memset(bigger , 0 , sizeof(bigger)) ;
         Divide(1 , n , 1) ;
         ans = 0 ;
         for(i = 1 ; i <= (int)log2(0.5+ n)+1 ; i++)
            ans += bigger[i] ;
         printf("%lld\n" ,ans) ;
    }
    return 0;
}


你可能感兴趣的:(归并排序逆序对短小代码)