Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 21264 | Accepted: 7578 |
DescriptionIn this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
Input
Output
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
题意是让你求将一组数排序的最小交换次数,其实就是求逆序对。。。注意应该用64位
下面是我的代码
#include<cstdio> #include<iostream> #define N 500005 __int64 a[N],t[N],cnt; using namespace std; void merge(int x,int y,long long *a,long long *t) { int m,i,sum=0,p,q; if(y-x>1) { m=x+(y-x)/2; p=x,q=m,i=x; merge(x,m,a,t); merge(m,y,a,t); while(p<m||q<y) { if(q>=y||(p<m&&a[p]<a[q])) { t[i++]=a[p++]; } else { t[i++]=a[q++]; cnt+=m-p; } } for(i=x;i<y;i++) a[i]=t[i]; } } int main() { int i,n; while(1) { cin>>n; if(n==0) return 0; for(i=0;i<n;i++) { cin>>a[i]; } cnt=0; merge(0,n,a,t); printf("%I64d\n",cnt); } return 0; }