UVa 11495 - Bubbles and Buckets
题目大意:给一个有n个数的序列,通过交换相邻的逆序数使这个序列最终有序,求需要交换的次数。
本来可以用冒泡排序解决,但是n达到105,用冒泡排序会超时,用O(nlogn)的归并排序可以达到要求。《算法竞赛入门经典》第八章的“逆序对数”有详细介绍。
1 #include <cstdio> 2 #define MAXN 100000+10 3 4 int a[MAXN], tmp[MAXN]; 5 int cnt; 6 7 void merge_sort(int l, int r) 8 { 9 if (r-l == 1) return; 10 int mid = l + (r-l)/2; 11 merge_sort(l, mid); 12 merge_sort(mid, r); 13 int p = l, q = mid, k = l; 14 while (p < mid || q < r) 15 { 16 if (q >= r || (p < mid && a[p] < a[q])) 17 tmp[k++] = a[p++]; 18 else 19 { 20 tmp[k++] = a[q++]; 21 cnt += mid - p; 22 } 23 } 24 for (int i = l; i < r; i++) 25 a[i] = tmp[i]; 26 } 27 28 int main() 29 { 30 #ifdef LOCAL 31 freopen("in", "r", stdin); 32 #endif 33 int n; 34 while (scanf("%d", &n) && n) 35 { 36 for (int i = 0; i < n; i++) 37 scanf("%d", &a[i]); 38 cnt = 0; 39 merge_sort(0, n); 40 if (cnt % 2) printf("Marcelo\n"); 41 else printf("Carlos\n"); 42 } 43 return 0; 44 }