1 /* 2 * 归并排序求逆序对 3 */ 4 5 #include <cstdio> 6 #include <iostream> 7 8 using namespace std; 9 10 const int N = 500005; 11 12 long long ans; 13 int a[N], b[N]; 14 15 void mergeSort(int left, int right) { 16 int i, j, k, mid; 17 if (left < right) { 18 mid = (left + right) >> 1; 19 mergeSort(left, mid); 20 mergeSort(mid+1, right); 21 k = left; 22 for (i=left,j=mid+1; i<=mid&&j<=right;) { 23 if (a[i] > a[j]) b[k++] = a[j++], ans += mid-i+1;//逆序对 24 else b[k++] = a[i++]; 25 } 26 while (i <= mid) b[k++] = a[i++]; 27 while (j <= right) b[k++] = a[j++]; 28 for (i=left; i<=right; ++i) a[i] = b[i]; 29 } 30 } 31 32 int main() { 33 int n; 34 while (scanf("%d", &n), n) { 35 for (int i=1; i<=n; ++i) scanf ("%d", &a[i]); 36 ans = 0; 37 mergeSort(1, n); 38 printf ("%lld\n", ans); 39 } 40 return 0; 41 }