-9 逆序输出一个整数的各位数字_【每日算法】基础算法——归并排序[求逆序对的数量](四)(思想很经典)...

题目内容

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

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

输入格式

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

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

输出格式

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

数据范围

1≤n≤100000

输入样例

6

2 3 4 5 6 1

输出样例

5

题解

整个题根据归并排序算法+分治的思想来求解。

我们将整个序列均分成前后两个部分。将所有的逆序对分成以下三种情况,分别是:

  • 逆序对中的两个数在前一个区间

  • 逆序对中的两个数在后一个区间

  • 逆序对中的两个数一个数在前一个区间,一个数在后一个区间。

当然,这里需要说明一个问题,那就是前两种情况其实在递归中转化为了第三种情况,比如有个逆序对在前一个区间里,当进行递归之后,这两个数字最终会被切割成两个区间的数字,变为第三种情况,基于此,题目的代码只需要编写对第三种的情况就可,这种结合很巧妙。同时,merge_sort函数的返回定义为逆序对的数量,因此,左右两边是个子问题,所以两个函数递归完就可以求出左右两个区间内部的逆序对数了。由于归并排序的过程中对序列进行了排序,因此前一个区间中的i代表的数若大于后一个区间j代表的数,那么此时针对j代表的数的逆序对的数量为mid-i+1。

需要注意的点

由于数据范围是10万,逆序对的数量最多为 10^5x(10^5 -1)/2,大概是 5x10^9 ,这个数值大于int的最大值,因此在代码层面,需要用long long类型来进行求解。

代码实现

#include using namespace std;typedef long long LL;const int N = 100010;int n;int q[N],tmp[N];LL merge_sort(int l , int r){    if (l>=r) return 0; #递归结束的标志        int mid = l+r>>1; # 去中间的位置    LL res = merge_sort(l, mid) + merge_sort(mid+1, r); # 进行递归,将一个大问题编程两个子问题求解,同时返回值是前后两个区间内部的逆序对的数量。        //归并过程    int k = 0, i = l, j = mid + 1;    while (i <= mid && j <= r)        if (q[i] <= q[j]) tmp[k++] = q[i++]; # 当q[i]小于q[j],则不作处理        else{            tmp[k++] = q[j++];            res += mid-i+1; # 当q[i]大于q[j],则说明i后的全部数字大于q[j],因此针对q[j]来说,逆序对数量为mid-i+1        }    //扫尾    while(i<=mid) tmp[k++] = q[i++]; # 此时的情况说明上面的while是后面的区间遍历完成,前面的区间仍然没有遍历完,因此需要对前面的区间进行扫尾工作。    while(j<=r) tmp[k++] = q[j++]; # 反之亦然        for (int i=l, j=0; i<=r; i++,j++) q[i]=tmp[j]; # 将临时数组的排列后的有序数组存入q中,保证递归循环后的q的前后两个区间内部有序。        return res;}int main(){    cin >> n;    for(int i = 0; i < n; i++) cin >> q[i];        cout << merge_sort(0,n-1)<< endl;        return 0;}

5a729d705b05dbd0f74803441170192f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国计算机等级考试题库二级C操作题100套(第27套)

第27套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;计算下式前n项的和作为函数值返回。 例如&#xff0c;当形参n的值为10时&#xff0c;函数返回&#xff1a;9.612558。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意&am…

Raphael学习笔记(2)--绘图(基本图形)

为什么80%的码农都做不了架构师&#xff1f;>>> 1、图形简介 与html5不同&#xff0c;Raphael提供了以下基本图形&#xff1a;矩形、圆形、椭圆形&#xff08;html5只有矩形&#xff09;。 Paper.rect(x,y,width,height,r)&#xff1a;绘制矩形&#xff1b; 参…

windows2003 apache php mysql_Windows 2003搭建Apache PHP MySQL环境经验分享

本文所述是在windows2003上搭建&#xff0c;软件版本为Apache2.2.6(Win32)&#xff0c;PHP5.2.4&#xff0c;MySQL5.0.45&#xff0c;phpMyAdmin2.11.1。Apache和MySQL需要安装&#xff0c;PHP和phpmyadmin都是解压配置使用。详细的安装过程就不说了&#xff0c;到网上搜索一大…

java基础57 css样式、选择器和css定位(网页知识)

本文知识点&#xff08;目录&#xff09;&#xff1a; 1、CSS样式 2、选择器 3、CSS定位 1、CSS样式 1.html 在一个网页中负责的是一个页面的结构 2.css(层叠样式表)在一个页面中负责了一个页面的样式. css文档&#xff08;教程&#xff09;&#xff1a;http://www.w3…

电子计算机场地通用规范_最全的视频监控系统施工规范要求

前言&#xff1a;今天我们一起来看下监控施工详细规范步骤。可以参考一下&#xff0c;有些东西可能不符合你的项目要求&#xff0c;但是都可以做删减正文&#xff1a;一、工程设计、验收标准《城市道路设计规范》 CJJ37-90《城市道路交通规划设计规范》GB50220-95 《道路交通标…

全国计算机等级考试题库二级C操作题100套(第28套)

第28套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;统计形参s所指字符串中数字字符出现的次数&#xff0c;并存放在形参t所指的变量中&#xff0c;最后在主函数中输出。例如&#xff0c;形参s所指的字符串为&#xff1a;abcdef35adgh3kjsdf7。输出结果为&…

Intent的一些用法

2019独角兽企业重金招聘Python工程师标准>>> Intent用法实例 1.无参数Activity跳转 Java代码 Intent it new Intent(Activity.Main.this, Activity2.class); startActivity(it); 2.向下一个Activity传递数据&#xff08;使用Bundle和Intent.putExtras&#x…

idea建立一个java工程_IntelliJ IDEA(三、各种工程的创建 -- 之一 -- 创建一个简单的Java工程)...

一、创建一个简单的Java工程&#xff1a;HelloWorld1. Eclipse的第一步是选择工作空间&#xff0c;然后创建项目&#xff1b;IDEA不同(没有工作空间的概念)&#xff0c;第一步就直接创建具体的项目&#xff0c;项目创建过程中会选择在本地的存储位置(本地的某个文件夹)。Eclips…

BZOJ1488: [HNOI2009]图的同构

BZOJ1488: [HNOI2009]图的同构 Description 求两两互不同构的含n个点的简单图有多少种。 简单图是关联一对顶点的无向边不多于一条的不含自环的图。 a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后&#xff0c;a图的顶点集和边集能完全与b图一一对应。Input 输入一…

5折交叉验证_数据集的划分——交叉验证法

本文作者&#xff1a;王 歌 文字编辑&#xff1a;戴 雯 技术总编&#xff1a;张 邯前面我们在举例时&#xff0c;通常是将所使用的数据集按照75%和25%的比例划分为训练集和测试集&#xff0c;这主要是为了我们举例方便&#xff0c;同时划分后的数据量也依然符合大样本的要求。其…

全国计算机等级考试题库二级C操作题100套(第29套)

第29套&#xff1a; 程序通过定义学生结构体变量&#xff0c;存储了学生的学号、姓名和3门课的成绩。函 数fun的功能是对形参b所指结构体变量中的数据进行修改,最后在主函数中输出修改后的数据。 例如: b所指变量t中的学号、姓名、和三门课的成绩依次是: 10002、 “ZhangQi”、…

思科CCIE认证知识点之IPv6地址

IPv6是IETF&#xff08;互联网工程任务组&#xff0c;Internet Engineering Task Force&#xff09;设计的用于替代现行版本IP协议&#xff08;IPv4&#xff09;的下一代IP协议。 一、IPV6的地址&#xff1a; IPv6 地址共 128位&#xff0c;通过 8 个十六进制的地址块格式来…

python实现50行代码_50行Python代码,教你获取公众号全部文章

> 本文首发自公众号&#xff1a;python3xxx 爬取公众号的方式常见的有两种 - 通过搜狗搜索去获取&#xff0c;缺点是只能获取最新的十条推送文章 - 通过微信公众号的素材管理&#xff0c;获取公众号文章。缺点是需要申请自己的公众号。 ![图片描述](//img.mukewang.com/5d21…

java部署平台_开源Java自动化部署平台JDeploy

JDeploy是Java Shell实现的基于Linux系统的自动化、可视化的项目部署平台&#xff0c;能部署Java服务、Java Web项目&#xff0c;可以简化项目部署操作&#xff0c;无需繁琐的黑窗口SSH指令及Jenkins复杂的配置。传统部署方式&#xff1a;从SVN/GIT服务器检出代码->在IDE中…

A*算法在最短路问题的应用及其使用举例

1 A*算法 A*算法在人工智能中是一种典型的启发式搜索算法&#xff0c;启发中的估价是用估价函数表示的&#xff1a; 其中f(n)是节点n的估价函数&#xff0c;g(n)表示实际状态空间中从初始节点到n节点的实际代价&#xff0c;h(n)是从n到目标节点最佳路径的估计代价。另外定义h(n…

全国计算机等级考试题库二级C操作题100套(第30套)

第30套&#xff1a; 程序通过定义学生结构体变量&#xff0c;存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参a所指结构体变量中的数据赋给函数中的结构体变量b&#xff0c;并修改b中的学号和姓名&#xff0c;最后输出修改后的数据。例如&#xff1a;a所指变量中…

pytorch 使用cpu_想读读PyTorch底层代码?这份内核机制简介送给你

机器之心报道参与&#xff1a;思源学习 PyTorch 比较简单&#xff0c;但你能学习 PyTorch 内部机制吗&#xff1f;最近&#xff0c;有 14 年 ML 经验的大神 Christian 介绍了 PyTorch 的内核机制。虽然在实际使用中并不需要这些知识&#xff0c;但探索 PyTorch 内核能大大提升我…

java web 自定义标签_JavaWeb学习——自定义标签

自定义标签一、自定义标签概述使用标准JSP访问、操作JavaBean&#xff0c;是实现展现(HTML)与业务实现(Java代码)分离的第一步。然而&#xff0c;标准方法功能不够强大&#xff0c;以至于开发者无法仅仅使用它们开发应用&#xff0c;还要在JSP页面中使用Java代码。介于JavaBean…

739. Daily Temperatures - LeetCode

Question 739. Daily Temperatures Solution 题目大意&#xff1a;比今天温度还要高还需要几天 思路&#xff1a;笨方法实现&#xff0c;每次遍历未来几天&#xff0c;比今天温度高&#xff0c;就坐标减 Java实现&#xff1a; public int[] dailyTemperatures(int[] temperatur…

全国计算机等级考试题库二级C操作题100套(第31套)

第31套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;对形参s所指字符串中下标为奇数的字符按ASCII码大小递增排序&#xff0c;并将排序后下标为奇数的字符取出&#xff0c;存入形参p所指字符数组中&#xff0c;形成一个新串。 例如&#xff0c;形参s所指的…