逆序对的个数

给定一个长度为 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. 关于MicroPython mpremote工具 的一些用例,闲聊

    关于MicroPython mpremote工具 的一些用例,闲聊 我尝试了很多不同的第三方micropython工具,有些是Windows应用程序,有些是VScode插件. 但是当我尝试过Micro ...

  2. KingbaseES不同字符类型比较转换规则

    Postgresql 常用的字符数据类型的有char.varchar和text,其中 char 固定长度类型, varchar 和 text 是可变长度类型.这三种类型在进行比较时,会进行隐含的类型转 ...

  3. OID 与隐含列

    熟悉PostgreSQL的都知道,PG12 开始,不再支持OID伪列.KingbaseES 为了保证与旧版本兼容,特增加了OID 隐含列的支持. R3版本:OID 是整个数据库共用的"序列& ...

  4. Docker_构建_运行总结

    样例: 构建镜像 build-image-fim-backend.sh echo "开始构建 fim-backend 镜像..." cp -rp ../target/fim-bac ...

  5. Redis变慢?深入浅出Redis性能诊断系列文章(一)

    (本文首发于"数据库架构师"公号,订阅"数据库架构师"公号,一起学习数据库技术)   Redis 作为一款业内使用率最高的内存数据库,其拥有非常高的性能,单节点 ...

  6. Docker安装MySQL并使用Navicat连接

    MySQL简单介绍: MySQL 是一个开放源码的关系数据库管理系统,开发者为瑞典 MySQL AB 公司.目前 MySQL 被广泛地应用在 Internet 上的大中小型网站中.由于其体积小.速度快 ...

  7. Django 创建 APP和目录结构介绍

    一.通过pip安装Django 以windows 系统中使用pip命令安装为例 win+r,调出cmd,运行命令:pip install django自动安装PyPi 提供的最新版本.指定版本,可使用 ...

  8. 上K8s生产环境的准备有哪些?

    文章转载自:https://mp.weixin.qq.com/s/7FhiI09xKdJXJfrf89Q-8w 在生产中运行应用程序可能很棘手.这篇文章提出了一个自以为是的清单,用于在 Kuberne ...

  9. K8s deployments的故障排查可视化指南已更新(2021 中文版)

    转载自:https://mp.weixin.qq.com/s/07S930e6vsN2iToo0gP0zg 英文版 高清图地址:https://learnk8s.io/a/a-visual-guide ...

  10. Linux实例常用内核网络参数介绍与常见问题处理---重要

    文章转载自:https://help.aliyun.com/knowledge_detail/41334.html 本文主要介绍如下几点内容,您可以根据实际需要选择. 查看和修改Linux实例内核参数 ...