Brainman
http://poj.org/problem?id=1804
求逆序数,用归并写的,不知道什么叫树状数组,以后看了再尝试
} else if (aux[i] > aux[j]) { sum += end1-i+1; a[t] = aux[j++]; } else { a[t] = aux[i++]; }
错写成
} else if (aux[i] > aux[j]) { sum += end1-i+1; a[t] = a[j++]; } else { a[t] = a[i++]; }
卡了我 1 小时,哭 …
#include <stdio.h> #include <string.h> const int maxn = 1005; int a[maxn]; int aux[maxn]; int sum; void merge(int l, int mid, int r) { int i = l; int j = mid+1; int end1 = mid; int end2 = r; for (int t = l; t <= r; t++) { aux[t] = a[t]; } for (int t = l; t <= r; t++) { if (i > end1) { a[t] = aux[j++]; } else if (j > end2) { a[t] = aux[i++]; } else if (aux[i] > aux[j]) { sum += end1-i+1; a[t] = aux[j++]; } else { a[t] = aux[i++]; } } } void msort(int l, int r) { if (l < r) { int mid = (l + r) / 2; msort(l, mid); msort(mid+1, r); merge(l, mid, r); } } int main(void) { int t; int n; scanf("%d", &t); for (int j = 1; j <= t; j++) { sum = 0; memset(a, 0, sizeof(a)); scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } msort(0, n-1); printf("Scenario #%d:\n%d\n\n", j, sum); } return 0; }