求逆序数

时间限制:2000 ms  |  内存限制:65535 KB
难度:5
 
描述

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。

现在,给你一个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)排序)的更多相关文章

  1. 归并排序及应用 (nyoj 117 求逆序数)

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

  2. NYOJ 117 求逆序数 (树状数组)

    题目链接 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 现在,给你一个N个元素的序列,请你判断出 ...

  3. SDUT 3402 数据结构实验之排序五:归并求逆序数

    数据结构实验之排序五:归并求逆序数 Time Limit: 40MS Memory Limit: 65536KB Submit Statistic Problem Description 对于数列a1 ...

  4. SDUT-3402_数据结构实验之排序五:归并求逆序数

    数据结构实验之排序五:归并求逆序数 Time Limit: 50 ms Memory Limit: 65536 KiB Problem Description 对于数列a1,a2,a3-中的任意两个数 ...

  5. 51 Nod 1107 斜率小于0的连线数量 (转换为归并求逆序数或者直接树状数组,超级详细题解!!!)

    1107 斜率小于0的连线数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题   二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线 ...

  6. 2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)

    题目链接 题意 : 给你一个数列,可以随意交换两相邻元素,交换次数不超过k次,让你找出i < j 且ai > aj的(i,j)的对数最小是多少对. 思路 : 一开始想的很多,各种都想了,后 ...

  7. POJ 2299 Ultra-QuickSort 求逆序数 (归并或者数状数组)此题为树状数组入门题!!!

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 70674   Accepted: 26538 ...

  8. hiho一下 第三十九周 归并排序求逆序数

    题目链接:http://hihocoder.com/contest/hiho39/problem/1 ,归并排序求逆序数. 其实这道题也是可以用树状数组来做的,不过数据都比较大,所以要离散化预处理一下 ...

  9. [CF 351B]Jeff and Furik[归并排序求逆序数]

    题意: 两人游戏, J先走. 给出一个1~n的排列, J选择一对相邻数[题意!!~囧], 交换. F接着走, 扔一硬币, 若正面朝上, 随机选择一对降序排列的相邻数, 交换. 若反面朝上, 随机选择一 ...

随机推荐

  1. NodeJS操作MongoDB数据库

    一.node.js对于mongodb的基本操作 1.数据库的开机 首先我们要先对数据库进行开机的操作,建立一个文件夹用于存放数据库文档.如D:\mongo,接下去在cmd当中键入命令-> mon ...

  2. opencv::凸包-Convex Hull

    概念介绍 什么是凸包(Convex Hull),在一个多变形边缘或者内部任意两个点的连线都包含在多边形边界或者内部. 正式定义:包含点集合S中所有点的最小凸多边形称为凸包 Graham扫描算法 首先选 ...

  3. 基于SkyWalking的分布式跟踪系统 - 环境搭建

    前面的几篇文章我们聊了基于Metrics的监控Prometheus,利用Prometheus和Grafana可以全方位监控你的服务器及应用的性能指标,在出现异常时利用Alertmanager告警及时通 ...

  4. 由浅入深:Python 中如何实现自动导入缺失的库?

    在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No module named 'xxx' 或者 ModuleNotFoundError: No mod ...

  5. 基础安全术语科普(四)——RFID

    RFID —— Radio Frequency Identification (射频识别技术) 概念:RFID属于一种无源技术(Passive Technology) 使用:生活中RFID无处不在.如 ...

  6. 百万年薪python之路 -- 数据库初始

    一. 数据库初始 1. 为什么要有数据库? ​ 先来一个场景: ​ 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来hold住十一期间全国的购票需求,你怎么写? 由于在同一时 ...

  7. 钢铁B2B电商案例:供应链金融如何解决供应链金融痛点

    一.区块链是什么 区块链是一种按照时间顺序将数据块以特定的顺序相连的方式组合成的链式数据结构,其上存储了系统诞生以来所有交易的记录.区块链上的数据由全网节点共同维护并共同存储,同时以密码学方式保证区块 ...

  8. .NET 任务调度 ,基于Quartz.Net

    本文中使用的为 Quartz Enterprise Scheduler .NET,版本为 3.0.8 . 架构拓扑图如下: 集群需要配置: #是否集群 true falsequartz.jobStor ...

  9. CentOS7.5模板机配置

    CentOS7.5模板机配置 标签(空格分隔): linux学习知识整理 Mr.Wei's notes! 人一定要有梦想,没有梦想那根咸鱼有什么区别: 即便自己成为了一条咸鱼,也要成为咸鱼里最咸的那一 ...

  10. Shiro框架 - 【shiro基础知识】

     转载:https://segmentfault.com/a/1190000013875092#articleHeader27  读完需要 63 分钟   前言 本文主要讲解的知识点有以下: 权限管理 ...