逆序对的个数

给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。

逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。

输入格式

第一行包含整数 n,表示数列的长度。

第二行包含 n 个整数,表示整个数列。

输出格式

输出一个整数,表示逆序对的个数。

数据范围

1≤n≤100000,

数列中的元素的取值范围 [1,109]。

输入样例:

6

2 3 4 5 6 1

输出样例:

5

个人解析:

根据题意可知这是一道求逆序对的题,我想第一次碰到这种题都是暴力求解吧,但这里我们其实也可以使用归并排序和树状数组(不会),因此我也只能先用归并排序求解一遍了。

算法实现:

主要就是归并排序,只不过多了一行代码罢了。,其主要思想在于分治和单调性。

那么我们先来看归并排序的实现:

1.先将数组从中间一分为二,形成两个子数组,然后不断递归分割下去,直到剩下一个数时停止。不断对递归过程中产生的左右两个子数组进行合并排序(这里可以使用双指针优化),记住我们是先递归再优化因此数组长度是从小到大。如当两个数组长度为2时,对其进行合并排序成一个长度为4的数组,如果数组长度不是偶数,则根据向下取整的特性选取中点。除此之外,左右两个子数组也都是单调的,毕竟是先排序再合并的。

2.在第1步使用双指针排序数组,即先创建一个temp数组作为中间数组,将左数组的一个数与右数组的一个数进行比较,谁小谁先放进temp(升序),直至某一个数组排序完成就退出排序过程,但如果另一个数组依然存在数的话,也一定是较大的,直接接到temp数组后面即可。

3.用排序后的新数组temp覆盖掉原来对应位置上的旧数组就相当于完成了对这一部分的合并排序,并将其用在后续的排序中。

需要格外注意的是,基于单调性我们可以知道当左数组存在一个数x比右数组的一个数y要大时,那么由于左数组是单调递增的,则从x往后的所有数都比y要大,因此逆序对的个数是从x开始到左子数组结束,也就是mid-i+1(i是x在左子数组中的下标)

代码实现:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; void merge_sort(int q[],int l,int r,long long *ans){
if(l >= r) return ;
int tmp[100000];
int mid = (l+r) >> 1;
merge_sort(q,l,mid,ans);
merge_sort(q,mid+1,r,ans);
int i=l,j = mid+1,cnt = 0;
while(i <= mid && j <= r){
if(q[i] <= q[j]){
tmp[cnt ++] = q[i++];
}
else{
tmp[cnt ++] = q[j++];
*ans += mid - i + 1; // 分治+单调即可
}
}
while(i <= mid) tmp[cnt++] = q[i++];
while(j <= r) tmp[cnt++] = q[j++];
for(i=l,j=0; i<=r ; ++i, ++j){
q[i] = tmp[j];
}
} int main()
{
long long ans = 0;
int a[100000] = {0};
int n;
cin >> n;
for(int i=0; i < n ; ++i) cin >> a[i];
merge_sort(a,0,n-1,&ans);
printf("%lld",ans);
return 0;
}

2022-11-02 Acwing每日一题的更多相关文章

  1. CISP/CISA 每日一题 11

    CISA 每日一题(答) 一个合理建造的数据仓库应当支持下列三种基本的查询格式: 1.向上溯源和向下溯源——向上溯源是对数据进行总计:向下溯源是将数据进行细化: 2.交叉溯源——通过通用属性访问数据仓 ...

  2. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  3. 【Java每日一题】20161122

    package Nov2016; import java.util.ArrayList; import java.util.Iterator; public class Ques1122 { publ ...

  4. 【Java每日一题】20170222

    20170221问题解析请点击今日问题下方的“[Java每日一题]20170222”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; import jav ...

  5. PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数

    PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数 最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可 ...

  6. CISP/CISA 每日一题 五

    CISA 每日一题(答) 信息系统审计师要确认系统变更程序中的: 1.变更需求应有授权.优先排序及跟踪机制: 2.日常工作手册中,明确指出紧急变更程序: 3.变更控制程序应同时为用户及项目开发组认可: ...

  7. [每日一题]ES6中为什么要使用Symbol?

    关注「松宝写代码」,精选好文,每日面试题 加入我们一起学习,day day up 作者:saucxs | songEagle 来源:原创 一.前言 2020.12.23日刚立的flag,每日一题,题目 ...

  8. [每日一题]面试官问:谈谈你对ES6的proxy的理解?

    [每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  9. 【js】Leetcode每日一题-完成所有工作的最短时间

    [js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ...

  10. 【JavaScript】Leetcode每日一题-青蛙过河

    [JavaScript]Leetcode每日一题-青蛙过河 [题目描述] 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子 ...

随机推荐

  1. 【IDEA】IDEA怎么汉化&汉化后怎么转回英文

    ① 英文转中文 1.点击左上角的File,然后选择Setting 2.达到Setting页面选择Plugins 3.在搜索框搜索chinese,选择中文语言包下载 4.找到下载插件,选择勾选上,然后o ...

  2. dotnet 设计规范 · 数组定义

    ✓ 建议在公开的 API 使用集合而不是数组.集合可以提供更多的信息. X 不建议设置数组类型的字段为只读.虽然用户不能修改字段,但是可以修改字段里面的元素.如果需要一个只读的集合,建议定义为只读集合 ...

  3. Html飞机大战(五):主角登场(英雄类编辑)

    好家伙, 遇到了一些非常奇怪的bug index.html:179 Uncaught TypeError: Failed to execute 'drawImage' on 'CanvasRender ...

  4. 详谈 MySQL 8.0 原子 DDL 原理

    柯煜昌 青云科技研发顾问级工程师 目前从事 RadonDB 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验. 文章字数 3800+,阅读时间 15 分钟 背景 MySQL 5.7 的字 ...

  5. 关于mciSendString函数调用mp3音频的问题

    先说结论:这个函数一定要调用MP3文件,手动改MP3格式无效,一定要保证下载源是MP3格式文件.具体可参考:https://blog.csdn.net/m0_46436640/article/deta ...

  6. Elastic:创建你的第一个Elastic alert

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/105340379 在Elasticsearch可以提供给我们数据的存储及快速的搜索,但 ...

  7. 使用工具SecureCRT通过ssh远程连接Windows server 2019

    Windows Server 2019 开通SSH Server服务 在需要安裝的ws2019开启powershell,执行安装 openssh server 指令 Add-WindowsCapabi ...

  8. 如何通过 Java 代码隐藏 Word 文档中的指定段落

    在编辑Word文档时,我们有时需要将一些重要信息保密. 因此,可以隐藏它们以确保机密性. 在本文中,将向您介绍如何通过 Java 程序中的代码隐藏 Word 文档中的特定段落.下面是我整理的具体步骤, ...

  9. 云原生虚拟网络 tun/tap & veth-pair

    云原生虚拟网络 tun/tap & veth-pair 转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/684 ...

  10. HBase(1/5)

    HBase学习(一) 一.了解HBase 官方文档:https://hbase.apache.org/book.html 1.1 HBase概述 HBase 是一个高可靠性.高性能.面向列.可伸缩的分 ...