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 }
View Code

 

posted @ 2013-08-31 15:02  xiaobaibuhei  阅读(236)  评论(0编辑  收藏  举报