poj2299(归并排序求逆序对)

来源:互联网 发布:java中的集合框架 编辑:程序博客网 时间:2024/05/20 12:21
#include<stdio.h>    #include<stdlib.h>    int a[500001];int t[500001],k;long long ans;void gbpx(int x,int y){    int u,v,m,i;    if(x==y)return;    m=(x+y)/2;    if(x<=m)gbpx(x,m);    if(m+1<=y)gbpx(m+1,y);    u=x;v=m+1;    k=0;    while(u<=m && v<=y){        if(a[u]>a[v]){            ans+=m-u+1;            t[++k]=a[v];            v++;        }else{            t[++k]=a[u];            u++;        }    }    for(i=u;i<=m;i++)t[++k]=a[i];    for(i=v;i<=y;i++)t[++k]=a[i];    for(i=1;i<=k;i++)a[x+i-1]=t[i];    }    int main(){        int i,j,k,m,n;       while (1){  scanf("%d",&n);    if (n==0) break;   ans=0;       for (i=1;i<=n;i++)            scanf("%d",&a[i]);       if (n>1) gbpx(1,n);        printf("%lld\n",ans);    }    return 0;}

1 0