#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;
}
Friday, November 2, 2012
Counting Inversions With Merge Sort
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment