1688 求逆序对

1688 求逆序对

  时间限制: 1 s

 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
题目描述 Description

给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目

数据范围:N<=105。Ai<=105。时间限制为1s。

输入描述 Input Description

第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。

输出描述 Output Description

所有逆序对总数.

样例输入 Sample Input

4

3

2

3

2

样例输出 Sample Output

3

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 const int N = 1e5 + 10;
 6 
 7 int n;
 8 int a[N];
 9 int b[N];
10 long long ans;
11 
12 void merge_sort(int l, int r)
13 {
14     if(l==r) return;
15     int m = (l+r) / 2;
16     merge_sort(l, m);
17     merge_sort(m+1, r);
18     int i = l, j = m+1, k = l;
19     while(i<=m && j<=r)
20         if(a[i]<= a[j]) b[k++] = a[i++];
21         else ans += m-i+1, b[k++] = a[j++];
22     for(; i<=m; b[k++] = a[i++]);
23     for(; j<=r; b[k++] = a[j++]);
24 
25     for(i=l; i<=r; i++) a[i] = b[i];
26 }
27 int main()
28 {
29     scanf("%d",&n);
30     for(int i=1; i<=n; i++) scanf("%d", &a[i]);
31     merge_sort(1, n);
32     printf("%lld
", ans);
33     return 0;
34 }
原文地址:https://www.cnblogs.com/mjtcn/p/6816992.html