(分治)51NOD 1019 逆序数

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
 
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
Input
第1行:N,N为序列的长度(n <= 50000)
第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)
Output
输出逆序数
Input示例
4
2
4
3
1
Output示例
45
解:分治
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int sn[50005];
 5 
 6 int cmp(const void *a, const void *b)
 7 {
 8     return *(int *)a > *(int *)b ? 1 : -1;
 9 }
10 
11 void merge(int st, int mid, int en,int *p)
12 {
13     for (int i = mid + 1, j = st; j < mid + 1 && i <= en; j++)
14     {
15         if (sn[j] > sn[i])
16         {
17             *p += mid + 1 - j--;
18             i++;
19         }
20     }
21     qsort(&sn[st], en - st + 1, 4, cmp);
22 }
23 
24 void msort(int st,int en, int *p)
25 {
26     if (st >= en) return;
27     int mid = (st + en) / 2;
28     msort(st, mid, p);
29     msort(mid + 1, en, p);
30     merge(st, mid, en, p);
31     return;
32 }
33 
34 int main()
35 {
36     int n;
37     while (scanf_s("%d", &n) != EOF)
38     {
39         int ans = 0;
40         for (int i = 0; i < n; i++) scanf_s("%d", &sn[i]);
41         msort(0, n - 1, &ans);
42         printf("%d\n", ans);
43     }
44     return 0;
45 }

 

posted @ 2018-09-11 13:59  Ekalos  阅读(143)  评论(0编辑  收藏  举报