http://poj.org/problem?id=2299
这应该是传说中的模版题吧?
归并排序 +逆序对数 代码在算法竞赛入门经典上有
#include<stdio.h> long long num; int a[500010],t[500010]; void merge_sort(int *a,int x,int y,int *t) { if(y-x>1) { int m=x+(y-x)/2; int p=x,q=m,i=x; merge_sort(a,x,m,t); merge_sort(a,m,y,t); while(p<m||q<y) { if(q>=y||(p<m&&a[p]<=a[q])) t[i++]=a[p++]; else { t[i++]=a[q++]; num+=m-p; } } for(i=x; i<y; i++) a[i]=t[i]; } } int main() { int n,i; while(scanf("%d",&n)&&n) { for(i=0; i<n; i++) scanf("%d",&a[i]); num=0; merge_sort(a,0,n,t); printf("%lld\n",num); } return 0; }