合并排序求逆序对,和poj2299一样,写一下为了再熟悉一下merge sort #include<iostream> using namespace std; #define N 1005 int a[N],b[N]; int cnt; void merge(int s[],int d[],int l,int m,int r) { int i,j,k,q; i=k=l; j=m+1; while(i<=m&&j<=r) { if(s[i]<=s[j]) d[k++]=s[i++]; else { cnt+=(m-i+1); d[k++]=s[j++]; } } if(i>m) for(q=j;q<=r;q++) d[k+q-j]=s[q]; else for(q=i;q<=m;q++) d[k+q-i]=s[q]; for(q=l;q<=r;q++) s[q]=d[q]; } void mergesort(int s[],int left,int right) { if(left<right) { int i=(left+right)/2; mergesort(s,left,i); mergesort(s,i+1,right); merge(s,b,left,i,right); } } int main() { int ca,n,i,j; scanf("%d",&ca); for(j=1;j<=ca;j++) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",a+i); cnt=0; mergesort(a,1,n); printf("Scenario #%d:/n",j); printf("%d/n/n",cnt); } return 0; }