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 }