题意描述的是求冒泡排序过程中交换的次数。如果用冒泡排序统计次数的话会超时
,因为有这么一条性质,排序交换的次数等于逆序数之和,所以转化成求逆序数之和。用归并排序。
#include<stdio.h> #include<string.h> #include<stdlib.h> const int MAXN = 500050; int A[MAXN], T[MAXN], n; __int64 cnt; void MergeSort(int l, int r) { int p, q, i, m; if(r - l > 1) { m = l + r >> 1; p = l, q = m, i = l; MergeSort(l, m); MergeSort(m, r); while(p < m || q < r) { if(q >= r || (p < m && A[p] <= A[q])) T[i ++] = A[p ++]; else T[i ++] = A[q ++], cnt += m - p; } for(i = l; i < r; i ++) A[i] = T[i]; } } int main() { int i; while(scanf("%d", &n), n) { cnt = 0; for(i = 0; i < n; i ++) scanf("%d", &A[i]); MergeSort(0, n); printf("%I64d\n", cnt); } return 0; }