http://poj.org/problem?id=2299
题意 : 排序,求排序次数,本来以为用冒泡可以搞定,事实上,那么大的数据以及一个TLE告诉我,会超时.........
思路 : 问了一下,这个题就是归并排序求逆序数,可以百度一下,看了白皮书

#include<cstdio> #include<cstring> #include<iostream> using namespace std ; int A[500400],T[500400]; long long cnt ; 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++] ; cnt += m-p ; } } for(i = x ; i < y ; i++) A[i] = T[i] ; } } int main() { int n; while(scanf("%d",&n)!=EOF) { if(n == 0) break ; cnt = 0 ; for(int i = 1 ; i <= n ; i++) { scanf("%d",&A[i]) ; } merge_sort(A,1,n+1,T); printf("%lld ",cnt) ; } return 0 ; }