Friday, November 2, 2012

Counting Inversions With Merge Sort


#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
#define siz 1000005
typedef long long ll;
ll swp;
int a[siz];

void merge(int p, int q, int r){
    int len1=q-p+1;
    int len2=r-q;

    vector <int> left;
    vector <int> right;

    for(int i=0;i<len1;i++) left.push_back(a[p+i]);
    for(int i=0;i<len2;i++) right.push_back(a[i+q+1]);

    left.push_back(999999999+10);
    right.push_back(999999999+10);

    size_t x=0;
    size_t y=0;

    for(int i=p;i<=r;i++){
        if(left[x]<=right[y]) a[i]=left[x++];
        else{
            a[i]=right[y++];
            swp+=(len1-x);
        }
    }
}
void merge_sort(int p, int r){
    if(p<r){
        int q=(p+r)/2;
        merge_sort(p,q);
        merge_sort(q+1,r);
        merge(p,q,r);
    }
}
int main()
{
    int n;
    //freopen("input.txt","r",stdin);
    while(scanf("%d",&n)==1){
        if(n==0) break;
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        swp=0;
        merge_sort(0,n-1);

        cout<<swp<<endl;
    }
    return 0;
}


No comments:

Post a Comment