题目链接: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 求逆序数相关推荐

  1. nyoj117求逆序数 并归排序法

    题目链接:http://115.159.40.116/problem_show.php?pid=4729 或者:http://acm.nyist.net/JudgeOnline/problem.php ...

  2. [置顶] 归并排序,逆序数

    写了个模板类,指针 a为被排序,b为tmp 返回逆序数,调用时候Merge.sort(a,b,n); #define ll long long template<class T> clas ...

  3. nyoj- 117 求逆序数 hdu-sort it---- 树状数组

    nyoj-117(离散化) #include<stdio.h> #include<string.h> #include<algorithm> using names ...

  4. hdu 1394(树状数组求逆序数)

    解题思路:这道题是求循环数组中逆序数最小值,求逆序数这里肯定是用树状数组.只是这里有一点点变化,由于题目中n位数是0-n-1的一个排列,所以num[i]可表示为比num[i]小的数的个数.把第一位的数 ...

  5. NYOJ 117 求逆序数

    求逆序数 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序 ...

  6. 【归并排序】-求逆序数算法

    1.归并排序 归并排序是分治法的一种典型应用,应用递归思想,自顶向下思考:先假定MergeSort()可以将一个乱序数组排好序,因此可以开始分(将一个数组平均分成两部分),再治(分别调用MergeSo ...

  7. 离散化+树状数组求逆序数

    题目:http://poj.org/problem?id=2299 离散化是一种常用的技巧,有时数据范围太大,可以用来放缩到我们能处理的范围 因为其中需排序的数的范围0--- 999999999:显然 ...

  8. 高级排序求逆序数之分治法

    前面几篇文章都有讲分治法,分而治之,一种很典型的算法思想,现在求逆序数,如果是你初次接触,一般都会想到冒泡法来统计逆序数.不过冒泡法的时间复杂度确实高(n²),所以接下来运用分治法来实现,复杂度为(n ...

  9. hdu 2838求逆序数开了两个数组

    http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    ...

  10. 求逆序数-第12届蓝桥杯Scratch省赛3真题第3题

    [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第43讲. 第12届蓝桥杯青少年组省赛分两次进行,这是2021年4月24日举行的第二次省赛考 ...

最新文章

  1. C语言 | C语言实现日历打印
  2. ABAP table buffer test
  3. 双机通信c语言程序,双机通信(C语言、主机和从机共用程序)
  4. linux命令apprw,linux命令学习1(示例代码)
  5. 据说有人面试栽在了Thread类的stop()方法和interrupt()方法上
  6. [C++] - 类的构造函数constructor
  7. c语言数据驱动编程,如何学习智能手机驱动编程
  8. docker 常用命令 五 容器日志
  9. 常平计算机培训班,常平大朗CNC编程培训速成班,一个月学会UG编程
  10. Loadrunner:管理员权限启动报错“win10为了对电脑进行保护,已经阻止此应用”
  11. 2020-12-3background-color对div元素不起作用
  12. H5实现调用本地摄像头实现实时视频以及拍照功能
  13. 5.服务网关:GateWay
  14. R语言如何做FDR校正(21)
  15. Nginx的安装和应用(详细介绍)
  16. Cooapods为iOS项目配置SnapKit等第三方框架
  17. 【详细!!】计算机类书籍整理
  18. openjudge 1.5.15 银行利息
  19. html中colGroup,col
  20. 2019 ECNU Campus Invitational Contest

热门文章

  1. Layer success 层弹出后的成功回调方法
  2. marven编译时:<pre>错误: 不允许使用自关闭元素</pre>
  3. 连范例都不跑,大哥你怎么知道你的代码正确?
  4. 文字处理技术:形状绕排的难点
  5. FFMpeg编译支持NVidia CODEC(成功)
  6. LINUX下载编译libreadline
  7. 关于怕什么来什么的说法,是否成立
  8. MAC共享目录让WINDOWS访问
  9. Java集合里面的值唯一_java 判断集合元素唯一的原理
  10. C# dataGridView控件 控件中至少有一列没有模板问题【解决】 添加新列