51nod 1019 逆序数
2016-03-01 20:07
281 查看
参考了《数据结构与算法分析》中归并排序的算法。
#include <iostream> const int MAX = 5e4 + 5; int res; int arr[MAX]; int arr2[MAX]; void mergesort(int a[], int tmp[], int l, int r) { if (l == r) return ; int m = (l + r) >> 1; mergesort(a, tmp, l, m); mergesort(a, tmp, m + 1, r); for (int i = l; i <= r; ++i) tmp[i] = a[i]; int i1 = l, i2 = m + 1; for (int curr = l; curr <= r; ++curr) { if (i1 == m + 1) a[curr] = tmp[i2++]; else if (i2 > r) a[curr] = tmp[i1++]; else if (tmp[i1] <= tmp[i2]) a[curr] = tmp[i1++]; else {//当左边的子序列出现一个数大于右边的子序列的时候,左边子序列末尾数的位置减去当前左边这个数的位置加1就得到了有多少逆序对了 // std::cout << tmp[i1] << " " << tmp[i2] << std::endl; res += (m - i1 + 1); a[curr] = tmp[i2++]; } } } int main() { int num; std::cin >> num; for (int i = 0; i != num; ++i) std::cin >> arr[i]; mergesort(arr, arr2, 0, num - 1); std::cout << res << std::endl; //for (int i = 0; i != num; ++i) // std::cout << arr[i] << ' '; return 0; }
相关文章推荐
- 分享个C++封装Libcurl代码(支持下载文件、GET\POST、重定向断点续传等功能)
- LaTeX soul包
- C语言实现单链表的逆序打印(带头结点)
- 通信基站(dfs回溯,思维)
- js中智能右键菜单
- 深度学习阅读列表 Deep Learning Reading List
- 查找BADI的方法
- STL-list实现
- Oracle EBS VMI/寄售(6)--不能创建冲减解决方案
- MergeKSortedList
- 视图小介
- 【POJ 1961】Period(KMP求循环节)
- LeetCode OJ 56. Merge Intervals 贪心法求解
- java实现单链表
- makefile中的为目标如何理解
- meta标签中的http-equiv属性使用介绍
- 非关系型数据库NoSQL
- Activity之间的传值
- jqgrid动态列生成
- 深入理解Java异常处理机制