AcWing 788. 逆序对的数量(归并排序)

news2024/11/28 5:28:18

基本思想

归并排序是用分治思想,分治模式在每一层上有三个步骤:

(1)分解:将n个元素分解成n/2个元素的子序列。

(2)解决:用合并排序法对两个子序列递归排序。

(3)合并:合并两个已排序的子序列得到排序结果。

 代码实现

void merge_sort(int q[], int l, int r)   //q[]原数组
{
    //递归的终止情况
    if(l >= r) return;

    //第一步:分成子问题
    int mid = l + r >> 1;

    //第二步:递归处理子问题
    merge_sort(q, l, mid ), merge_sort(q, mid + 1, r);

    //第三步:合并子问题
    int k = 0, i = l, j = mid + 1, tmp[r - l + 1];
    //tmp数组是临时数组,用来接收两个子序列合并排序后的结果
    while(i <= mid && j <= r)
        if(q[i] <= q[j]) tmp[k++] = q[i++];
        else tmp[k++] = q[j++];
    while(i <= mid) tmp[k++] = q[i++];
    while(j <= r) tmp[k++] = q[j++];
    //把排序好的数组返回给原数组
    for(k = 0, i = l; i <= r; k++, i++) q[i] = tmp[k];
}

例题

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

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

输入格式

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

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

输出格式

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

数据范围

1≤n≤100000
数列中的元素的取值范围 [1,109]

6
2 3 4 5 6 1

输出样例:

5

 代码实现

#include<iostream>
using namespace std;
const int N=1e5+10;
typedef long long LL;
int a[N],midd[N];

LL mesort(int l,int r){
	if(l>=r)return 0;
	int mid=l+r>>1;
	LL ans=mesort(l,mid)+mesort(mid+1,r);
	
	int c=0,i=l,j=mid+1;
	while(i<=mid&&j<=r){
		if(a[i]<=a[j])midd[c++]=a[i++];
		else{
			ans+=mid-i+1;
			midd[c++]=a[j++];
		}
	}
	while(i<=mid)midd[c++]=a[i++];
	while(j<=r)midd[c++]=a[j++];
	for(int i=l,j=0;i<=r;j++,i++)a[i]=midd[j];
	return ans; 
}


int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	cout<<mesort(1,n)<<endl;
	return 0;
} 

核心代码解释

int c=0,i=l,j=mid+1;
	while(i<=mid&&j<=r){
		if(a[i]<=a[j])midd[c++]=a[i++];
		else{
			ans+=mid-i+1;
			midd[c++]=a[j++];
		}
	}

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

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

相关文章

护眼灯的色温是多少比较好?如何选择护眼台灯

色温是台灯的一个重要指标&#xff0c;它可以表示光线中包含颜色的成分&#xff0c;从理论上简单来讲&#xff0c;色温从低到高对应着光线从黑到红&#xff0c;再到黄、白&#xff0c;最后到蓝色光。色温也可以对应大众所熟悉的色调&#xff0c;色温越高&#xff0c;光线偏白色…

开学哪种电容笔好用?推荐的ipad手写笔

如果你希望通过iPad进行绘画&#xff0c;那么Apple Pencil就很重要了。不过&#xff0c;苹果原装电容笔的售价实在是太高了&#xff0c;许多人无法承受。因此&#xff0c;最佳方法是选择一款平替电容笔。我以前一直用iPad平板&#xff0c;也是个数码爱好者&#xff0c;这两年我…

AJAX学习笔记6 JQuery对AJAX进行封装

AJAX学习笔记5同步与异步理解_biubiubiu0706的博客-CSDN博客 AJAX请求相关的代码都是类似的&#xff0c;有很多重复的代码&#xff0c;这些重复的代码能不能不写&#xff0c;能不能封装一个工具类。要发送ajax请求的话&#xff0c;就直接调用这个工具类中的相关函数即可。 用J…

jar包冲突: java.lang.NoSuchFieldError: REFLECTION

接入第三方时&#xff0c;导入了第三方的SDK&#xff0c;导致项目其他功能读取本地xml时出错&#xff0c;根据具体日志查看发现是具体某个jar包版本的问题 根据上图可看到&#xff0c;问题在com.sun.xml.bind包&#xff0c;于是根据便向着把我导入的SDK下所属的该jar过滤掉&am…

MySQL递归查询所有子集

在 MySQL 数据库中&#xff0c;WITH RECURSIVE 是递归查询的一种语法。然而&#xff0c;MySQL 并不支持 WITH RECURSIVE 语法。相反&#xff0c;MySQL 提供了另一种递归查询的方法&#xff0c;即使用 CONNECT BY 和 START WITH 语法。 如果您需要执行递归查询&#xff0c;建议…

C++多态虚析构和纯虚析构

虚析构和纯虚析构 多态使用时&#xff0c;如果子类中有属性开辟到堆区&#xff0c;那么父类指针在释放时无法调用子类的析构代码 注释&#xff1a;父类指针在释放时&#xff0c;只会调用父类自己的析构函数&#xff0c;而无法调用子类的析构函数 解决方式&#xff1a;将父类的…

诚实守信、专业严谨、合规自律、公开透明——嘉泰实业

每一次暖心的沟通都是一次公益,真诚不会因为它的渺小而被忽略;每一声问候都是一次公益,善意不会因为它的普通而被埋没。熟悉嘉泰实业的人都知道,这家企业不但擅长在金融理财领域里面呼风唤雨,同时也非常擅长在公益事业当中践行,属于企业的责任心,为更多有困难的群体带来大爱的传…

结构体的简单介绍(2)

目录 结构体的特殊声明 结构体的自引用 结构体的特殊声明 在声明结构的时候&#xff0c;可以不完全的声明。 比如&#xff1a; struct {int a;char b;float c; }x; 以上结构在声明的时候省略掉了结构体标签&#xff08;tag&#xff09;。 那么会有什么影响呢&#xff1f…

Qt CMake 中国象棋程序实现

前驱课程 C自学精简实践教程 目录(必读) C数据结构与算法实现&#xff08;目录&#xff09; Qt 入门实战教程&#xff08;目录&#xff09; 项目初衷 为学习 Qt 的人提供一个合适的有一定难度的综合型练习项目。 在学会写代码之前&#xff0c;先看别人怎么写的代码。深入…

计算机竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

基于Java+SpringBoot+Vue前后端分离论坛系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

2000-2022年上市公司融资约束指数(KZ、SA、FC和WW指数)(含原始数据、方法说明和计算结果)

2000-2022年上市公司融资约束指数&#xff08;KZ、SA和WW指数&#xff09;&#xff08;含原始数据和计算结果&#xff09; 1、时间跨度&#xff1a;2000-2022年 2、区域范围&#xff1a;沪深A股上市公司 3、指标说明&#xff1a; 证券代码、证券简称、统计截止日期、是否剔…

SSD202D-编译固件重启无法进入kernel

今天打包发现我的固件一直重启,我一直以为是没升级好; 然后根据log发现在进入kernel的时候挂掉了 汇编都暴出来了,这就很焦灼 我查看对比正常启动的log,boot一模一样,等了很久之后会有概率进系统 我要查看问题在哪里,搞得焦头烂额 1.我用以前的固件确认一下问题是不是在板…

高忆管理:证券账户国债逆回购怎么操作?

国债逆回购的本质就是一种短期贷款&#xff0c;个人经过国债回购商场把自己的资金借出去&#xff0c;取得固定的利息收益&#xff0c;那么&#xff0c;证券账户国债逆回购怎样操作&#xff1f;怎样在股票账户上买国债逆回购&#xff1f;下面高忆管理为我们准备了相关内容&#…

Editplus打开当前文件所在的文件夹

一个小技巧&#xff1a;Editplus打开当前文件所在的文件夹&#xff0c;备忘记录一下。 1、打开目录窗口 AltShift3&#xff0c;打开目录窗口&#xff08;Directory Window&#xff09;&#xff0c;这是开关键&#xff0c;再按一次会关闭目录窗口。 2、打开文件夹 在“目录窗…

git代码撤销回滚只看这一篇就足够了!

1. 代码撤销 目前大家都在使用git&#xff0c;在项目开发中&#xff0c;总会遇到提交的代码有问题&#xff0c;想要撤销回滚的操作&#xff0c;关于撤销回滚代码单独给大家介绍一下。   正常的提交代码如果要提交到远程仓库有下边3步命令&#xff1a; git add . ------------…

软件测试/测试开发丨Web自动化 测试用例流程设计

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27173 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1…

RobotFramework自动化测试框架系列学习-----(一)简介、搭建、运行

一、简介 基于Python的关键字驱动的自动化框架。 1.基于Python&#xff1a;就是由python语言开发的这个框架。 2.关键字驱动&#xff1a;关键字驱动测试又称为表格驱动测试&#xff0c;是自动化测试的一种方法&#xff0c;是数据测试的一种改进方法。关键字驱动主要包括测试步骤…

利用vba处理Excel表格数据实现键值转化,适用于将编码转化成对应的文本

最近遇到了一个甲方需要提供系统登录的用户名单和对应的角色权限内容。无奈直接从数据库导出的数据对应的都是编码&#xff0c;没有转成中文&#xff0c;想着偷个懒能不能直接用Excel直接转&#xff0c;网上看了一下有修改单元格格式的&#xff0c;但需要编码是2到3个。多的就用…

HyperDock 1.8.0.10(Dock优化工具)

HyperDock 是一款为 macOS 设计的实用工具&#xff0c;它提供了许多方便快捷的功能&#xff0c;使您能够更高效地管理和操作应用程序窗口。 首先&#xff0c;HyperDock 提供了类似于 Windows 7 的任务栏预览功能。当您将鼠标悬停在应用程序图标上时&#xff0c;会显示该应用程…