POJ 2299 归并排序 求逆序对数

时间:2021-05-13 09:52:29

http://poj.org/problem?id=2299


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <math.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
#define N 500050


long long cnt;

void Msort(int A[],int T[],int low,int high){

    if(high - low > 1){
        int mid = low + (high-low)/2;

        Msort(A,T,low,mid);
        Msort(A,T,mid, high);

        int i = low;
        int j = mid;
        int k = low;
//        while(i<mid || j<high){
//            if(j>=high || (i<mid && S2[i]<=S2[j])){
//                T[k++] = S2[i++];
//            }else{
//                T[k++] = S2[j++];
//                cnt += (mid-i);
//            }
//        }
        while(i<mid && j<high){
            if(A[i]<=A[j]) {
                T[k++] = A[i++];
            }
            else{
                T[k++] = A[j++];
                cnt += (mid-i);
            }

        }
        while(i<mid){
            T[k++] = A[i++];
        }
        while(j<high){
            T[k++] = A[j++];
        }
        for(int i=low;i<high;i++) A[i] = T[i];
    }
}
int f[N];
int ans[N];

int main() {
    //freopen("/Users/a1/Public/20150717/20150717/in.txt","r",stdin);

    int n;
    while(scanf("%d",&n) && n){
        cnt = 0;
        for(int i=0;i<n;i++){
            scanf("%d",&f[i]);
        }
//        for(int i=0;i<n;i++)
//            printf("%d ",f[i]);
        Msort(f,ans,0,n );  //左闭右开
//        for(int i=0;i<n;i++)
//            printf("%d ",ans[i]);
//        }
        printf("%lld\n",cnt);
    }
    return 0;
}