- 1. 题目
- 2. 读题(需要重点注意的东西)
- 3. 解法
- 4. 可能有帮助的前置习题
- 5. 所用到的数据结构与算法思想
- 6. 总结
思路:归并排序,通过两个指针指向的值比较大小完成调整两个区间段的值。在每次判断大小时,输出逆序对的数量即可。
3. 解法---------------------------------------------------解法---------------------------------------------------:
#include4. 可能有帮助的前置习题using namespace std; typedef long long LL; const int N = 1e5 + 10; int a[N], tmp[N]; LL merge_sort(int q[], int l, int r) { if (l >= r) return 0; int mid = l + r >> 1; // res = 两个数都在左边的逆序对+两个数都在右边的逆序对+左边和右边的逆序对 LL res = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r); int k = 0, i = l, j = mid + 1; while (i <= mid && j <= r) if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ]; else { res += mid - i + 1; tmp[k ++ ] = q[j ++ ]; } while (i <= mid) tmp[k ++ ] = q[i ++ ]; while (j <= r) tmp[k ++ ] = q[j ++ ]; for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j]; return res; } int main() { int n; cin >> n ; for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]); cout << merge_sort(a, 0, n - 1) << endl; return 0; }
- [AcWing]787. 归并排序(C++实现)模板题
归并排序的应用


![[AcWing]788. 逆序对的数量(C++实现) [AcWing]788. 逆序对的数量(C++实现)](http://www.mshxw.com/aiimages/31/352676.png)
