问题 C: 求逆序对

题目描述

给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。

注意:n<=105,ai<=105

输入

第一行为n,表示序列长度。

接下来的n行,第i+1行表示序列中的第i个数。

输出

所有逆序对总数。

样例输入
4
3
2
3
2
样例输出
3

问题分析

直观方法:

最直接的方法是使用两层循环遍历所有元素对,检查是否构成逆序对。但这种方法的时间复杂度为O(n2),对于大数据量来说效率较低。

高效算法:

归并排序提供了一种更有效的方式来计算逆序对。

在归并排序的过程中,当一个元素从右半部分移动到左半部分时,它与左半部分所有剩余元素构成逆序对。

这样可以在O(nlogn) 的时间复杂度内计算出逆序对的总数。

分治策略:

使用分治方法将序列分成更小的子序列,分别计算每个子序列的逆序对,然后合并结果。

在合并两个已排序的子序列时,可以计算跨越两个子序列的逆序对。

#include <bits/stdc++.h>
#define int long long // 使用长整型
using namespace std;// 定义一个函数 merge,用于合并两个子数组并计算逆序对
int merge(vector<int>& a, int l, int mid, int r) {vector<int> temp(r - l + 1); // 创建一个临时数组存储合并后的结果int i = l, j = mid + 1, k = 0, count = 0; // 初始化指针和计数器// 合并两个子数组while (i <= mid && j <= r) {if (a[i] <= a[j]) {// 如果左侧元素小于等于右侧元素,复制左侧元素temp[k++] = a[i++];} else {// 如果左侧元素大于右侧元素,复制右侧元素// 并增加逆序对的数量(左侧剩余的元素个数)temp[k++] = a[j++];count = count + (mid - i + 1);}}// 复制剩余的左侧元素while (i <= mid) {temp[k++] = a[i++];}// 复制剩余的右侧元素while (j <= r) {temp[k++] = a[j++];}// 将合并后的数组复制回原数组for (int i = l, k = 0; i <= r; i++, k++) {a[i] = temp[k];}return count; // 返回计数的逆序对数量
}// 定义一个函数 mS(mergeSort 的缩写),用于递归地分治和合并
int mS(vector<int>& a, int l, int r) {int count = 0; // 初始化逆序对计数器if (l < r) {int mid = (l + r) / 2; // 计算中点// 递归地对左右子数组进行排序,并计算逆序对count = count + mS(a, l, mid);count = count + mS(a, mid + 1, r);// 合并两个子数组,并计算逆序对count = count + merge(a, l, mid, r);}return count; // 返回逆序对总数
}signed main() {int n;cin >> n; // 读取序列长度vector<int> a(n); // 创建序列数组for (int i = 0; i < n; i++) {cin >> a[i]; // 读取序列元素}int vi = mS(a, 0, n - 1); // 调用 mS 函数计算逆序对cout << vi << endl; // 输出逆序对的数量
}

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

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

相关文章

【spring之条件评估器】

Spring条件评估器 1. ConditionEvaluator是干嘛的2. 先看其属性类ConditionContextImp context3. 看ConditionEvaluator 的内部方法4. AnnotationTypeMetadata 是干嘛的5. Condition 接口 1. ConditionEvaluator是干嘛的 内部的使用类,用来评估注解的 2. 先看其属性类Condition…

[Linux] 一文理解HTTPS协议:什么是HTTPS协议、HTTPS协议如何加密数据、什么是CA证书(数字证书)...

之前的文章中, 已经分析介绍过了HTTP协议. HTTP协议在网络中是以明文的形式传输的. 无论是GET还是POST方法都是不安全的. 为什么不安全呢? 因为: HTTP协议以明文的形式传输数据, 缺乏对信息的保护. 如果在网络中传输数据以明文的形式传输, 网络中的任何人都可以轻松的获取数据…

何为算法之什么是算法

前言 你相信算法吗&#xff1f;对于这个问题的答案&#xff0c;我们并不关心&#xff0c;因为无论你信不信&#xff0c;不可否认的是算法席卷了你我的生活。 通信聊天时词汇的联想输入、网络购物时商品的关联推荐和下班回家时家电的智能声控&#xff0c;其算法早己悄无声息地进…

Java学习苦旅(二十六)——反射,枚举和lamda表达式

本篇博客将讲解反射&#xff0c;枚举和lamda表达式。 文章目录 反射定义用途反射基本信息反射相关的类Class类Class类中相关的方法 反射示例反射的优缺点优点缺点 枚举背景及定义常用方法枚举优缺点优点缺点 Lambda表达式背景语法函数式接口定义基本使用 变量捕获Lambda在集合…

力扣(leetcode)第387题字符串中的第一个唯一字符(Python)

387.字符串中的第一个唯一字符 题目链接&#xff1a;387.字符串中的第一个唯一字符 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入: s “leetcode” 输出: 0 示例 2:…

科学的摇篮 - 贝尔实验室

AT&T贝尔实验室&#xff08;AT&T Bell Laboratories&#xff09;是美国电信公司AT&T的研究与开发部门&#xff0c;成立于1925年。它在20世纪的许多年里一直是科学与技术创新的重要中心&#xff0c;做出了众多重大贡献&#xff0c;并为多项科技成就奠定了基础。以下…

Typescript 中创建对象的方式

1.type type MyObj {a: string;b: number;c: () > number; }; 2.interface interface MyObj {a: string;b: number;c: () > number; } 3. class class MyObj {a:string;b:number;c:()>number } // Error: Property staticProperty does not exist on type M.

Spring Boot应用启动时自动执行代码的五种方式

Spring Boot为开发者提供了多种方式在应用启动时执行自定义代码&#xff0c;这些方式包括注解、接口实现和事件监听器。在本篇博客中&#xff0c;我们将探讨一些常见的方法&#xff0c;以及如何利用它们在应用启动时执行初始化逻辑。 1. PostConstruct注解 PostConstruct注解…

嵌入式系统习题(考试相关)

文章目录 上一篇嵌入式系统概述ARM技术概述ARM指令Thumb指令集ARM程序设计 上一篇 嵌入式系统复习–基于ARM的嵌入式程序设计 嵌入式系统概述 嵌入式系统中常用的通信接口包括哪些&#xff1f; RS-232C串行通信接口&#xff0c;RS-422串行通信接口&#xff0c;RS-485串行通信…

【JAVA】Iterator 和 ListIterator 有什么区别?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 在Java中&#xff0c;遍历集合是日常编程中常见的任务&#xff0c;而Iterator和ListIterator作为遍历集合的两个主要接口&#xff0…

application.properties 如何改成 application.yml

Convert YAML and Properties File 右键直接转换即可 Further Reading &#xff1a; idea 常用插件

【两阶段鲁棒】计及需求响应的多能互补微网两阶段鲁棒优化matlab

目录 1 主要内容 算例模型 目标函数 第一阶段 第二阶段 求解流程图 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《多能互补微网两阶段鲁棒优化调度研究》&#xff0c;在考虑风光不确定集的基础上提出采用计及DR响应的多能互补微网两阶段鲁棒备用调度模…

通信触发流程

该示例方案主要介绍如何通过建立的Modbus或TCP通信来实现触发方案、协议解析、发送事件和以及响应配置等功能。 需求&#xff1a;使用Modbus通信触发指定流程运行。 搭建思路&#xff1a;在接收事件中使用协议组装&#xff0c;比较规则选择上升沿&#xff0c;当接收到的值从其…

【华为OD真题 Python】考古学家

文章目录 题目描述输入输出示例1输入输出说明示例2输入输出说明示例3输入输出说明备注实现代码题目描述 有一个考古学家发现一个石碑,但是很可惜࿰

知识图谱之汽车实战案例综述与前瞻分析

知识图谱的前置介绍 什么是知识图谱 知识图谱本质(Knowledge Graph&#xff09;上是一种叫做语义网络(semantic network &#xff09; 的知识库&#xff0c;即具有有向图结构的一个知识库&#xff1b;图的结点代表实体&#xff08;entity&#xff09;或者概念&#xff08;con…

大数据 Yarn - 资源调度框架

Hadoop主要是由三部分组成&#xff0c;除了前面我讲过的分布式文件系统HDFS、分布式计算框架MapReduce&#xff0c;还有一个是分布式集群资源调度框架Yarn。 但是Yarn并不是随Hadoop的推出一开始就有的&#xff0c;Yarn作为分布式集群的资源调度框架&#xff0c;它的出现伴随着…

Java Base64简单介绍

1. Base64工具 工具链接 2. Base64示例代码 public class Base64Demo {// 请注意&#xff0c;在处理二进制数据时&#xff08;例如图片或文件&#xff09;&#xff0c;不需要将字节数组转换为字符串再进行编码或解码&#xff0c;// 可以直接对字节数组进行Base64操作。上述…

路由器01_工作原理

一、回顾交换机工作原理 交换机里面维护了一张MAC地址表&#xff0c;主要记录的是MAC地址和接口的对应关系。 交换机在初始状态下&#xff0c;MAC地址表是空的&#xff0c;当收到一个来自某接口的数据时&#xff0c;首先查看数据帧中的MAC地址表&#xff0c;对照自己的MAC地址…

在IDEA中使用git分支进行开发然后合并到Master分支,2022.1.x版本

在实际开发过程中&#xff0c;为了避免因为在开发中出现的问题以及方便发布版本&#xff0c;如果是多版本发布的情况相下&#xff0c;我们通常需要采用分支进行开发&#xff0c;这个时候&#xff0c;我们就需要了解git分支的相关知识点了&#xff0c;本篇博客也是博主在实际公司…

近5年的学习经历总结

2013年迈入工作&#xff0c;到今年2024年&#xff0c;是工作的11个年头。从C语言嵌入式方向进入IT行业&#xff0c;再到云计算行业&#xff1b;最初做了将近3年的嵌入式开发&#xff0c;从STM32单片机开发&#xff0c;到arm-linux驱动&#xff0c;再到学习Centos/redhat系统&am…