[置顶] NYOJ117 求逆序数
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=117
题目分析:
如果直接一个一个的找,时间复杂度是O(n^2),这道题数据量很大,这样肯定会超时的。我们肯定都之后把有序数组a和b归并成另外一个有序数组。这个思想可以用到这里来,假设需要归并的数据段是[Begin,Mid)和[Mid,End)。用i,j分别遍历两个数据段,如果后面数据段中有数据比前一个数据段中的元素小,那么它跨越的长度就是逆序对的个数,即Mid-i,i是第一个比j大的数。这里要注意,数组最大的元素个数是10^6,最多的逆序对的个数为10^12-10^6,int最大也就2*10^9。肯定会越界的,所以这里要用long long来计数。
#include<stdio.h>
#include<string.h>
long long Merge(int *arr, int *ans, int Begin, int Mid, int End)
{int i,j,k;long long count = 0;for(i = Begin, j = Mid, k = Begin; i < Mid && j < End; ++k){if(arr[i] <= arr[j])ans[k] = arr[i++];else{//数组2中跨越数组1的长度即为逆序对的个数count += Mid - i;ans[k] = arr[j++];}}for( ; i < Mid; ++i, ++k)ans[k] = arr[i];for( ; j < End; ++j, ++k)ans[k] = arr[j];memcpy(&arr[Begin], &ans[Begin], (End - Begin) * sizeof(int));return count;
}long long MergeSort(int *arr, int *ans, int nLen)
{int i,l,e;long long count = 0;//步长跨度for(l = 1; l < nLen; l *= 2){for(i = 0; i + l < nLen; i += l + l){//第二部分的结束e = i + l + l > nLen ? nLen : i + l + l;count += Merge(arr, ans, i, i + l, e);}}return count;
}int arr[1000001];
int ans[1000001];
int main()
{int i,n,t;long long count;scanf("%d", &t);while(t--){scanf("%d",&n);for(i = 0; i < n; ++i)scanf("%d", &arr[i]);count = MergeSort(arr, ans, n);printf("%lld\n", count);}return 0;
}
[置顶] NYOJ117 求逆序数相关推荐
- nyoj117求逆序数 并归排序法
题目链接:http://115.159.40.116/problem_show.php?pid=4729 或者:http://acm.nyist.net/JudgeOnline/problem.php ...
- [置顶] 归并排序,逆序数
写了个模板类,指针 a为被排序,b为tmp 返回逆序数,调用时候Merge.sort(a,b,n); #define ll long long template<class T> clas ...
- nyoj- 117 求逆序数 hdu-sort it---- 树状数组
nyoj-117(离散化) #include<stdio.h> #include<string.h> #include<algorithm> using names ...
- hdu 1394(树状数组求逆序数)
解题思路:这道题是求循环数组中逆序数最小值,求逆序数这里肯定是用树状数组.只是这里有一点点变化,由于题目中n位数是0-n-1的一个排列,所以num[i]可表示为比num[i]小的数的个数.把第一位的数 ...
- NYOJ 117 求逆序数
求逆序数 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序 ...
- 【归并排序】-求逆序数算法
1.归并排序 归并排序是分治法的一种典型应用,应用递归思想,自顶向下思考:先假定MergeSort()可以将一个乱序数组排好序,因此可以开始分(将一个数组平均分成两部分),再治(分别调用MergeSo ...
- 离散化+树状数组求逆序数
题目:http://poj.org/problem?id=2299 离散化是一种常用的技巧,有时数据范围太大,可以用来放缩到我们能处理的范围 因为其中需排序的数的范围0--- 999999999:显然 ...
- 高级排序求逆序数之分治法
前面几篇文章都有讲分治法,分而治之,一种很典型的算法思想,现在求逆序数,如果是你初次接触,一般都会想到冒泡法来统计逆序数.不过冒泡法的时间复杂度确实高(n²),所以接下来运用分治法来实现,复杂度为(n ...
- hdu 2838求逆序数开了两个数组
http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Time Limit: 2000/1000 MS (Java/Others) ...
- 求逆序数-第12届蓝桥杯Scratch省赛3真题第3题
[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第43讲. 第12届蓝桥杯青少年组省赛分两次进行,这是2021年4月24日举行的第二次省赛考 ...
最新文章
- C语言 | C语言实现日历打印
- ABAP table buffer test
- 双机通信c语言程序,双机通信(C语言、主机和从机共用程序)
- linux命令apprw,linux命令学习1(示例代码)
- 据说有人面试栽在了Thread类的stop()方法和interrupt()方法上
- [C++] - 类的构造函数constructor
- c语言数据驱动编程,如何学习智能手机驱动编程
- docker 常用命令 五 容器日志
- 常平计算机培训班,常平大朗CNC编程培训速成班,一个月学会UG编程
- Loadrunner:管理员权限启动报错“win10为了对电脑进行保护,已经阻止此应用”
- 2020-12-3background-color对div元素不起作用
- H5实现调用本地摄像头实现实时视频以及拍照功能
- 5.服务网关:GateWay
- R语言如何做FDR校正(21)
- Nginx的安装和应用(详细介绍)
- Cooapods为iOS项目配置SnapKit等第三方框架
- 【详细!!】计算机类书籍整理
- openjudge 1.5.15 银行利息
- html中colGroup,col
- 2019 ECNU Campus Invitational Contest