题目117:求逆序数
来源:互联网 发布:阿里国际站数据分析 编辑:程序博客网 时间:2024/06/10 13:35
题目链接:
http://59.69.128.203/JudgeOnline/problem.php?pid=117
描述
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
现在,给你一个N个元素的序列,请你判断出它的逆序数是多少。
比如 1 3 2 的逆序数就是1。
输入
第一行输入一个整数T表示测试数据的组数(1<=T<=5)
每组测试数据的每一行是一个整数N表示数列中共有N个元素(2〈=N〈=1000000)
随后的一行共有N个整数Ai(0<=Ai<1000000000),表示数列中的所有元素。
数据保证在多组测试数据中,多于10万个数的测试数据最多只有一组。
输出
输出该数列的逆序数
样例输入
22
1 1
3
1 3 2
样例输出
01
算法思想:
这个题目使用简单的两层循环明显会超时。看了别人的解答才知道原来是可以使用合并排序来解决,还可以使用树状数组来解决。时间复杂度为O(NlogN)。
源代码
#include <iostream>#include <cstring>using namespace std;const int N = 1000005;int a[N];int swap_space[N];//归并排序的交换空间long long total;//逆序数void merge(int a[], int begin, int mid, int end){ int i = begin; int j = mid + 1; int k = begin; while (i <= mid && j <= end){ if (a[i] <= a[j]){ swap_space[k++] = a[i++]; } else{ swap_space[k++] = a[j++]; total += (mid - i + 1);//total is the reverse count } } while (i <= mid) swap_space[k++] = a[i++]; while (j <= end) swap_space[k++] = a[j++]; for (i = begin; i <= end; i++){ a[i] = swap_space[i]; }}void mergeSort(int a[], int begin, int end){ if (begin != end){ int mid = (begin + end) / 2; mergeSort(a, begin, mid); mergeSort(a, mid + 1, end); merge(a, begin, mid, end); }}int main(){ int T, N; cin >> T; while (T--) { total = 0; memset(a, 0, sizeof(a)); cin >> N; for (int i = 1; i <= N; i++) { cin >> a[i]; } mergeSort(a, 1, N); cout << total << endl; } return 0;}
阅读全文
0 0
- 题目117:求逆序数
- NYOJ 题目117求逆序数
- NYOJ 117 求逆序数【归并排序求逆序数】
- nyoj 117 求逆序数
- Nyoj 117 求逆序数
- NYOJ 117 求逆序数
- nyoj-117 求逆序数
- NYOJ 117 求逆序数
- nyoj 117 求逆序数
- NYOJ 117 求逆序数
- nyoj 117 求逆序数
- NYOJ 117 求逆序数
- nyoj 117 求逆序数【归并求逆序】
- nyoj 117 归并求逆序数
- NYOJ-117求逆序数【树状数组】
- NYOJ 117 求逆序数 【树状数组】
- 归并排序求逆序数 NYOJ 117
- nyoj 117 求逆序数【树状数组】
- Myeclipse中左边的项目目录调没了,怎么再让它显示出来
- Android Fragment 真正的完全解析(上)
- 实验七 静态查找表的查找
- Spring AOP基础
- python解析xml转化为csv
- 题目117:求逆序数
- VMware正常安装后仍然不能实现文件拖拽的原因
- keras 的LearningRateScheduler
- 高程第三章
- jQuery插件开发精品教程
- 特殊回文数
- jQuery金币兑换列表(单选自适应)
- Python入门
- for循环,迭代器,range范围的操作方法