Problem Description
对于数列a1,a2,a3…中的任意两个数ai,aj (i < j),如果ai > aj,那么我们就说这两个数构成了一个逆序对;在一个数列中逆序对的总数称之为逆序数,如数列 1 6 3 7 2 4 9中,(6,4)是一个逆序对,同样还有(3,2),(7,4),(6,2),(6,3)等等,你的任务是对给定的数列求出数列的逆序数。
Input
输入数据N(N <= 100000)表示数列中元素的个数,随后输入N个正整数,数字间以空格间隔。
Output
输出逆序数。
Example Input
10 10 9 8 7 6 5 4 3 2 1
Example Output
45
01 | #include<stdio.h> |
02 | #include<stdlib.h> |
03 | long long sum, sum2; |
04 | int a[111111]; |
05 | int tp[111111]; |
06 | void marge( int s1, int e1, int s2, int e2) |
07 | { |
08 | int ji = 0; |
09 | int p1 = s1, p2 = s2; |
10 | while (p1 <= e1 && p2 <= e2) |
11 | { |
12 | if (a[p1] <= a[p2]) |
13 | { |
14 | tp[ji++] = a[p1++]; |
15 | } |
16 | else |
17 | { |
18 | tp[ji++] = a[p2++]; |
19 | sum = sum + e1 - p1 +1; |
20 | } |
21 | } |
22 | while (p1 <= e1) |
23 | { |
24 | tp[ji++] = a[p1++]; |
25 | } |
26 | while (p2 <= e2) |
27 | { |
28 | tp[ji++] = a[p2++]; |
29 | } |
30 | for ( int i = 0; i < ji; i++) |
31 | { |
32 | a[i+s1] = tp[i]; |
33 | } |
34 | } |
35 | void sort( int l, int r) |
36 | { |
37 | if (l >= r) return ; |
38 | int mid = (l+r)/2; |
39 | sort(l, mid); |
40 | sort(mid+1, r); |
41 | marge(l, mid, mid+1, r); |
42 | } |
43 | int main() |
44 | { |
45 | int n, m, i, j, x, t; |
46 | sum = 0; |
47 | scanf ( "%d" , &n); |
48 | for (i = 0; i < n; i++) |
49 | { |
50 | scanf ( "%d" , &a[i]); |
51 | } |
52 | sort(0, n-1); |
53 | printf ( "%lld\n" , sum); |
54 | return 0; |
55 | } |
56 |