C1-A-求逆序对的个数

逆序对的数量(c++)(详细解答) 逆序对的数量(c++)(详细解答) 题目如下: 给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。 输入格式 第一行包含整数n,表示数列的长度。 第二行包含 n 个整数,表示整个数列。 输出格式 输出一个整数,表示逆序对的个数。 数据范围 1≤n≤100000 输入样例 6 2 3 4 5 6 1 输出 5 下面为解答过程: 这道题用到的是“归并排序 阅读详情

求逆序对的个数-归并排序

原题

题目描述
给定一个整数序列,求逆序对的个数

输入

第一个数为序列长度n,接下来一行,n个整数,保证在int范围内

输出

输出一行,逆序对的个数

输入样例

5
5 4 3 2 1

输出样例
10
数据范围
1<=n<=10^5

思路分析

分治思想
将大数组分成两个小数组,在数组内进行排序和查找逆序对,然后将两个数组合并,递归重复这个过程
求逆序对个数的思想
原来两个小数组内部逆序对的个数加上由于两数组合并而形成的新的逆序对的个数
新形成的逆序对个数的求法
在合并两小数组时,如果左边数组i位置元素小于等于右边数组j位置元素,则把i位置元素放在temp[q];如果右边j位置小于左边i位置,将j位置元素放在temp[q],并将count+=leftend-i+1;意思是既然i处元素比j处大,且i处元素原位置在j之前,即i,j处元素构成逆序对,那么i后面到leftend的所有元素都与j处元素构成逆序对。

AC代码

#include<stdio.h>
#include<stdlib.h>
int data[100010];
int tmp[100010];
void mSort(int k[],int tmp[],int left,int right);
long long merge(int k[],int tmp[],int left,int leftend,int rightend);
long long num=0;
int main()
{
	int i,n;
	long long count=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	  scanf("%d",&data[i]);
	mSort(data,tmp,0,n-1);
	
	printf("%lld",num);
}
//分治函数
void mSort(int k[],int tmp[],int left,int right)
{
	int center;
	long long n;
	if(left<right)
	{
		center=(left+right)/2;
		mSort(k,tmp,left,center);
		mSort(k,tmp,center+1,right);
		n=merge(k,tmp,left,center,right);
		num+=n;
	}
}
//合并函数
long long merge(int k[],int tmp[],int left,int leftend,int rightend)
{
	long long i=left,j=leftend+1,q=left;
	long long count=0;
	while(i<=leftend&&j<=rightend)
	{
		if(k[i]<=k[j])
		  tmp[q++]=k[i++];
		else
		{
			count+=leftend-i+1;
			tmp[q++]=k[j++];
		}
	}
	while(i<=leftend)
	  tmp[q++]=k[i++];
	while(j<=rightend)
	  tmp[q++]=k[j++];
	for(i=left;i<=rightend;i++)
	  k[i]=tmp[i];
	return count;
}

注意:
一开始提交时是0.9分,原来是有一个组数组num溢出了,需要用long long 来存储。
int的范围是-2,147,483,648 ~ 2,147,483,647。做题时一定要注意估计结果范围,以及注意long long类型的输入和输出都要使用%lld。

其他思路

参考大佬代码,使用了数据离散化。
以及树状数组来解决问题。

C语言基于归并排序求逆序对问题(完整C代码) 引言:归并排序采用把一个数组分割为单独的元素并且相邻两组合并的同时排序的方法进行数组的排序。具体的实现在任何一本数据结构书中都有描述,也不难理解。 今天我们 阅读详情

相关推荐

Cadence仿真数字电路功耗

Cadence仿真数字电路功耗 数字电路的功耗采用平均电流乘电源电压获得,所以本文的关键是测量平均电流。 仿真前设置好仿真参数后,在仿真的ADE街边选择:outputs➡to be saved➡select on design 选择电源的负端电流(若选择正端,则电流为负): 选择完成后,在ADE界面讲所选节点的plot也勾选上,点击run。仿真完成后自动显示波形。在波形上选中该电流曲线,右击选择:send to➡calculator 注意上图中,商店前的波形不稳定,需要进行截取。在calculator

qq_41519780的博客 1万+

求逆序对的三种方法

无

qq_52639492的博客 1万+

手把手教你用Python实现双三次插值(附OpenCV对比测试)

本文深入解析了双三次插值算法的数学原理,并提供了从零开始的Python实现教程。通过与OpenCV官方实现的对比测试,详细评估了不同插值算法(包括最邻近差值、双线性插值)在图像质量与计算性能上的差异,帮助开发者掌握高质量图像缩放的核心技术。

weixin_29310605的博客 293

逆序对的几种求法

逆序对的定义 设有一个序列,对于序列中任意两个元素ai,aj,若i&lt;j,ai&gt;aj,则说明ai和aj是一对逆序对。 逆序对的几种求法 1.暴力比较: 写两层循环,时间复杂度为 2.归并排序: 众所周知,归并排序就是将一个序列分成两部分进行排序,然后将排序后的两个序列中的元素一个一个插入(如图) 然后,我们发现,对于两个个正在排列的子序列,若后面的子序列中要插入元素,比...

juruo_hejiarui的博客 3万+

Android开发- (2)MediaProjection API实战:构建高效屏幕共享与远程控制方案

本文深入探讨了Android开发中利用MediaProjection API实现高效屏幕共享与远程控制方案的实战方法。文章从权限申请、虚拟屏幕创建讲起,详细解析了图像捕获、编码压缩、Socket网络传输的核心流程,并进一步介绍了如何构建双向控制通道及关键的性能优化与避坑指南,为开发者构建稳定可用的远程协作应用提供了完整路径。

weixin_29207533的博客 450

机器视觉/将HIK海康面阵相机连接Halcon软件

本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。

Dahe.qu 4866

逆序对的数量(C语言)

归并排序衍生的题,这种题第一次看到我想到的是用冒泡排序,但是一运行发现时间超时了,因为数据很大的话冒泡排序太麻烦,而且这题用归并排序很方便,在排序的同时可以直接找出有多少个逆序数

m0_74012728的博客 1827

Yolov8损失函数改进:MPDIoU新型边界框相似度度量,效果秒杀GIoU 、 DIoU 、CIoU 、 EIoU等 | ELSEVIER 2023

ELSEVIER 2023 MPDIoU新型边界框相似度度量助力yolov8,适用提升小目标、遮挡物性能提升

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 7774

求解逆序对的三种方法

剑指 Offer 51. 数组中的逆序对 解法一:归并排序 解法二:离散化+树状数组(或线段树) 解法三:红黑树(插入和查询)

qq_44729222的博客 447

★教程3:Simulink学习教程入门60例目录

1.订阅本教程用户可以免费获得本博任意1个(包括所有免费专栏和付费专栏)博文对应代码;2.本Simulink课程的所有案例(部分理论知识点除外)均由博主编写而成,供有兴趣的朋友们自己订阅学习使用。未经本人允许,禁止任何形式的商业用途;3.本课程除了介绍常见的Simulink模块介绍之外,我们更侧重于各种实例的完整设计介绍。从通信,控制器,图像处理,语音处理,电力系统等诸多常用领域介绍了相关案例,如果对于某个较为复杂的案例,初学者无法正确复现,也可以私信博主获得完整Simulink模型文件。

FPGA/MATLAB学习教程/源码/项目合作开发 1万+

prplOS介绍

介绍prplOS是什么,特性、框架、编译等。

四儿家的小祖宗的博客 2120

归并排序之求逆序对

何谓归并排序,先看下面一个例子: 设有数列{6,202,100,301,38,8,1} 初始状态:6,202,100,301,38,8,1 第一次归并后:{6,202},{100,301},{8,38},{1}; 第二次归并后:{6,100,202,301},{1,8,38}; 第三次归并后:{1,6,8,38,100,202,301}; 最终结果得出{1,6,8,38,100,202...

Welcome to tiny_spot 2万+

SAP 权限配置(复合角色)

复合角色创建步骤:业务场景:通常单一角色权限颗粒度划分比较细,当需要分配单一角色权限A、B(多个单一角色)给某账号用户Y时,可以先建立一个复合角色C,将A、B绑定到复合角色C中,再将角色C分配给账号Y即完成权限配置。 业务模拟: 1、PFCG创建复合角色: 2、在角色页面添加子角色 在角色分页内添加子角色,点击“菜单”分页中的“读菜单”即可导入子角色中的菜单: 3、将用户分配给...

willieyuan的博客 7087

C1-A-求逆序对个数

E1-A求逆序对个数题面解题思路逆序对的求解思路AC代码 时间限制: 300 ms 内存限制: 65536 kb 题面 题目链接 给定一个整数序列,求逆序对的个数 输入 第一个数为序列长度n 接下来一行,n个整数,保证在int范围内 输出 输出一行,逆序对的个数 输入样例 5 5 4 3 2 1 输出样例 10 数据范围 1≤n≤105 解题思路 逆序对的求解 思路 一般思路是对于每一个数据都向后搜索比它大的数,但这种方法的时间复杂度是o(n2) 这样的比较方式有没有让你联想到选择排序?选确定要排

CharlotTataku的博客 353

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

求序列A中逆序对的个数(C语言实现)

分治策略:编写一个实验程序,采用分治法求序列A中逆序对的个数,即逆序数。

qq_58773908的博客 3014

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【树状数组 求逆序对】排序

首先需要了解逆序对是什么:逆序对就是如果i &gt; j &amp;&amp; a[i] &lt; a[j],这两个就算一对逆序对。其实也就是对于每个数而言,找找排在其前面有多少个比自己大的数。那么思路就来了,树状数组又一次地优化了这种“需要遍历”的情况。那不就很容易了吗?依次把序列里的数放到树状数组中的A[i]上去(实际是以C[i]形式的插入函数),注意A[i]是以数值大小从小到大排列的。先插入...

It's the Climb 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

归并排序求逆序对(C语言)

归并排序求逆序对(C语言)

Keep_Trying_Go的博客 3320

C语言算法学习:求逆序对数量

通过本篇博客,我们深入探讨了如何通过归并排序算法求解逆序对数量,并分析了优化方案。关键是将统计逆序对的过程与排序操作结合,在归并的同时进行统计,极大地提高了效率。归并排序提供了一个高效的解决方案,时间复杂度为O(n log n)。使用合适的数据类型来防止溢出,特别是在大数据量的情况下。在实际编码时,注意递归的终止条件和优化合并过程的效率。如果你对逆序对或归并排序有任何疑问,欢迎留言讨论,和我们一起成长!

Huazzi的博客 3165

逆序对个数问题————分治(超简短代码)

P1908 逆序对 逆序对:在一个元素序列中有,a[i]>a[j],而i<j,则称这两个元素为一个逆序对。 逆序对使用分治的方法解决,相当于是进行一次递归排序(不懂的点这里),因此时间复杂度为o(nlogn)。 在对一个序列两个已排好序的子序列进行合并时,有两种情况 再这里用a[i],a[j]分别表示两个序列中的元素,l,mid,r 表示序列原序列最左,中间,最右下标。 a[i]<=a[j],则待加入元素,与未加入元素之间没有逆序对。 a[i]>a[j],则a[j]加入序列,a[j

qq_39910498的博客 2042

求逆序对个数问题

问题:求一组无序的元素中逆序对的个数 例:5 4 3 2 1 (5,4) (5,3)(5,2)—(3,2)(3,1)(2,1) 传统解决思路 双层for循环 时间复杂度O(n^2) //类似于选择排序 void test(int *arr,int n){ int count=0;//计数 for(int i=0;i<n-1;i++){ int flag = arr[i]; fo...

qq_42584241的博客 387

求逆序对 C语言

void merge(int *a, int p, int q, int r, int *num){ int i=p, j=q+1, k=0; int temp[r-p+1]; while(i<=q && j<=r){ if(a[i] <= a[j]) temp[k++] = a[i++]; ...

qq_43874157的博客 1920

统计逆序对的个数,并输出具体的逆序对(分治算法)

要求: 借鉴归并排序的算法,在归并的过程中,统计逆序对的个数,并记录下具体的逆序对。设计一个分治算法,并用C/C++语言实现编程。 #include "stdio.h" int count=0; void Merge(int r[],int r1[],int s,int m,int t) // 合并子序列 { int i=s,j=m+1,k=s; int b; while(i<=m...

su_simian的博客 6308

利用穷举算法求一个整数数组A中的逆序对的个数(C语言)

给定一个整数数组A=(a0,a1,…,an-1),若iaj,则就为一个逆序对,例如数组(3,1,4,5,2)的逆序对有,,,。设计一个穷举算法求A中的逆序对的个数。(分别用基本蛮力算法和递归蛮力算法实现)

weixin_74947024的博客 748

运用归并排序的原理统计数组中逆序对的个数

根据归并排序的思想,在每次归并的时候,需要对划分的两个区域,如下图中的蓝色和黄色区域,然后将temp[i]和temp[j]进行比较,将较小的值(此处对数组进行从小到大排序)存放到原数组arr中 在这个归并的过程中,就可以进行逆序对的统计,由于归并时的数组划分的两个区域已经排序完毕,所以数组是有序的,这时,假如temp[i]>temp[j],那么temp[i,mid]这个区间的所有数都大于t...

weixin_43862688的博客 645

求逆序对的个数(选择排序)

 求逆序对的个数逆序对是指数列中与需要排序的大小相反的数对。比如:数列中,从小到大逆序对的个数是8个,分别是逆序对可以用来衡量当前数列排序的情况,如果逆序对个数是零的时候,数列就是已经排序好的。求法:1.求逆序对的个数的算法很简单可以想象到修改选择排序就可以计算出逆序对的个数。具体如下:比如数列1: 选择第1个数5和他后边的数比较,得到逆序对,代价是C1*4(C1是常数)2: 选择第2个数

Divine Mind 1523
下一篇: C1-B-Rotate
拍坛对酒
博客等级 码龄6年 83粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值