题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2299 题意简述:给定一列数,求逆序数。 解题思路:用归并排序的方法,二分求解,直接上自己写的模版。 代码: #include<stdio.h> #include<algorithm> using namespace std; const int Max=500002; int a[Max],c[Max]; __int64 cnt; void MergeSort(int l,int r) //l起点(1),r终点(n+1) { int mid,i,j,tmp; if(r>l+1) { mid=(l+r)/2; MergeSort(l,mid); MergeSort(mid,r); tmp=l; for(i=l,j=mid;i<mid&&j<r;) { if(a[i]>a[j]) { c[tmp++]=a[j++]; cnt+=mid-i; // } else c[tmp++]=a[i++]; } if(j<r) for(;j<r;++j) c[tmp++]=a[j]; else for(;i<mid;++i) c[tmp++]=a[i]; for(i=l;i<r;++i) a[i]=c[i]; } } int main() { int n; while(scanf("%d",&n)&&n) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); cnt=0; MergeSort(1,n+1); printf("%I64d/n",cnt); } return 0; }