nyoj 117 求逆序数 (归并(merge)排序)
求逆序数
- 描述
-
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
现在,给你一个N个元素的序列,请你判断出它的逆序数是多少。
比如 1 3 2 的逆序数就是1。
- 输入
- 第一行输入一个整数T表示测试数据的组数(1<=T<=5)
每组测试数据的每一行是一个整数N表示数列中共有N个元素(2〈=N〈=1000000)
随后的一行共有N个整数Ai(0<=Ai<1000000000),表示数列中的所有元素。数据保证在多组测试数据中,多于10万个数的测试数据最多只有一组。
- 输出
- 输出该数列的逆序数
- 样例输入
-
2
2
1 1
3
1 3 2 - 样例输出
-
0
1 分析:1 归并排序(是稳定排序,只比快速排序慢一点):建立在归并操作上的一种排序,是指将有序的子序列进行合并,得到完全有序的序列;
2 及就是先使每个子序列有序,在使子序列段间有序。
3
4 此题,所求及就是从小到大排序过程,较小元素向前移动的步数,冒泡排序(算法复杂度O(n^2))算法模板:
void merge_achieve(int begin_pos, int mid_pos, int end_pos)
{
int i = being_pos, j = mid_pos + , k = end_pos;
while(i <= mid_pos && j <= end_pos)
{
if (A[i] <= A[j]) // 升序排列
temp[k ++] = A[i ++];
else
{
temp[k ++] = A[j ++];
ans += mid - i + ;
}
}
while (i <= mid_pos) tmep[k ++] = A[i ++];
while (j <= end_pos) temp[k ++] = A[j ++]; for (int ii = begin_pos; ii <= end_pos; ++ ii)
A[ii] = temp[ii];
} void merge_sort(int begin_pos, int end_pos)
{
int mid_pos;
if (begin_pos < end_pos) // 等于的情况,就集中到一个点上,不用比较大小
{
mid_pos = (begin_pos + end_pos) / ;
merge_sort(begin_pos ,mid_pos);
merge_sort(mid_pos + , end_pos);
merge_achieve(begin_pos, mid_pos, end_pos);
}
}C/C++代码实现(AC):
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <map>
#include <queue> using namespace std;
const int MAXN = 1e6 + ;
int A[MAXN], temp[MAXN], n;
long long ans; void merge_achieve(int begin_pos, int mid_pos, int end_pos)
{
int i = begin_pos, j = mid_pos + , k = begin_pos;
while(i <= mid_pos && j <= end_pos)
{
if (A[i] <= A[j])
temp[k ++] = A[i ++];
else
{
temp[k ++] = A[j ++];
ans += mid_pos - i + ;
}
}
while(i <= mid_pos) temp[k ++] = A[i ++];
while(j <= end_pos) temp[k ++] = A[j ++];
for (int ii = begin_pos; ii <= end_pos; ++ ii)
A[ii] = temp[ii];
} void merge_sort(int begin_pos, int end_pos)
{
if (begin_pos < end_pos)
{
int mid_pos = (begin_pos + end_pos) / ;
merge_sort(begin_pos, mid_pos);
merge_sort(mid_pos + , end_pos);
merge_achieve(begin_pos, mid_pos, end_pos);
}
} int main ()
{
int T;
scanf ("%d", &T);
while (T --)
{
ans = ;
scanf("%d", &n);
for(int i = ; i < n; ++ i)
scanf("%d", &A[i]);
merge_sort(, n - ); // this is [0, n-1], bug one
printf("%lld\n", ans);
}
return ;
}
nyoj 117 求逆序数 (归并(merge)排序)的更多相关文章
- 归并排序及应用 (nyoj 117 求逆序数)
求逆序数 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中 ...
- NYOJ 117 求逆序数 (树状数组)
题目链接 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 现在,给你一个N个元素的序列,请你判断出 ...
- SDUT 3402 数据结构实验之排序五:归并求逆序数
数据结构实验之排序五:归并求逆序数 Time Limit: 40MS Memory Limit: 65536KB Submit Statistic Problem Description 对于数列a1 ...
- SDUT-3402_数据结构实验之排序五:归并求逆序数
数据结构实验之排序五:归并求逆序数 Time Limit: 50 ms Memory Limit: 65536 KiB Problem Description 对于数列a1,a2,a3-中的任意两个数 ...
- 51 Nod 1107 斜率小于0的连线数量 (转换为归并求逆序数或者直接树状数组,超级详细题解!!!)
1107 斜率小于0的连线数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线 ...
- 2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)
题目链接 题意 : 给你一个数列,可以随意交换两相邻元素,交换次数不超过k次,让你找出i < j 且ai > aj的(i,j)的对数最小是多少对. 思路 : 一开始想的很多,各种都想了,后 ...
- POJ 2299 Ultra-QuickSort 求逆序数 (归并或者数状数组)此题为树状数组入门题!!!
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 70674 Accepted: 26538 ...
- hiho一下 第三十九周 归并排序求逆序数
题目链接:http://hihocoder.com/contest/hiho39/problem/1 ,归并排序求逆序数. 其实这道题也是可以用树状数组来做的,不过数据都比较大,所以要离散化预处理一下 ...
- [CF 351B]Jeff and Furik[归并排序求逆序数]
题意: 两人游戏, J先走. 给出一个1~n的排列, J选择一对相邻数[题意!!~囧], 交换. F接着走, 扔一硬币, 若正面朝上, 随机选择一对降序排列的相邻数, 交换. 若反面朝上, 随机选择一 ...
随机推荐
- PHP7源码之array_unique函数分析
以下源码基于 PHP 7.3.8 array array_unique ( array $array [, int $sort_flags = SORT_STRING ] ) (PHP 4 >= ...
- Flink整合oozie shell Action 提交任务 带kerberos认证
最近这段时间一直在忙新集群迁移,上了最新的cdh6.3.0 于是Flink 提交遇到了许多的问题 还好有cloudera License 有了原厂的帮助和社区的伙伴,问题解决起来快了不少,手动滑稽 集 ...
- opencv::SURF特征
SURF特征基本介绍 SURF(Speeded Up Robust Features)特征关键特性: -特征检测 -尺度空间 -选择不变性 -特征向量 工作原理 . 选择图像中POI(Points o ...
- 电脑扫描不出u盘的解决办法
现象:u盘已插上但是设备和驱动器里却找不到 解决办法: 首先记下u盘名称,然后 我的电脑-右键-管理-设备管理器,找到u盘,卸载设备后重新插入u盘即可
- 1.在ubuntu中软件安装在哪里?
ubuntu下安装软件有四种方式: 1.通过deb格式的离线软件包安装 sudo dpkg -i xxx.deb # 安装包,安装程序 -i: install sudo dpkg -r packa ...
- hadoop2.x的安装
可以自己从官网编译打包也可以直接下载官网的.gz包.自己编译打包的过程如下: .查看是否安装cmake.svn.openssl.ncurses,没有的直接安装上 yum list|grep cmake ...
- org.thymeleaf.exceptions.TemplateInputException: Error resolving template 报错
org.thymeleaf.exceptions.TemplateInputException: Error resolving template报错 遇到二次,第一次是刚刚学的时候,都是一个原因,而 ...
- SQL手工注入方法
SQL手工注入漏洞测试(MySQL数据库) 的靶场练习 流程与方法 注意:加粗部分给重点 查询数据库名http://219.153.49.228:46939/new_list.php?id=22 ...
- C++ 构造函数的执行过程(一) 无继承
引言 C++ 构造函数的执行过程(一) 无继承 本篇介绍了在无继承情况下, C++构造函数的执行过程, 即成员变量的构建先于函数体的执行, 初始化列表的数量和顺序并不对构造函数执行顺序造成任何影响 ...
- Spark集群安装与配置
一.Scala安装 1.https://www.scala-lang.org/download/2.11.12.html下载并复制到/home/jun下解压 [jun@master ~]$ cd sc ...