动态规划——逆序对

news2024/11/15 5:03:18
逆序对
Time Limit: 1000 MSMemory Limit: 5000 KB

Description

给定一个长度为N的int型数组a[0,1,2,...N-1], 请计算逆序对个数.当i<j且a[i]>a[j], 则称a[i]与a[j]是一对逆序对.

Input

第一行输入M表示包含M组测试数据,每组先输入N (N<=50000), 接着输入N个int型整数.

Output

输出逆序对个数.

Sample Input

2
5 1 5 2 1 3
6 85 16 44 99 66 1

Sample Output

4
9

解法:

这是一个求解逆序对问题的算法题。可以使用归并排序的思想进行求解。

归并排序的过程中,将两个有序数组合并成一个有序数组的过程中,若右边的元素小于左边的元素,则构成了逆序对。因此,在归并排序的过程中,可以统计逆序对的数量。

具体来说,对于一个数组a,可以将其分为两个子数组left和right,分别对left和right进行归并排序,得到两个有序数组,然后将这两个有序数组合并成一个有序数组,合并过程中统计逆序对的数量。这样就可以得到整个数组的逆序对数量。只需记录交换次数,即为逆序对数量

#include <iostream>
using namespace std;

const int N = 50010;

int a[N], b[N];

long long merge_sort(int l, int r) {
    if (l == r) return 0;  // 当数组长度为1时,逆序对数量为0

    int mid = (l + r) >> 1;  // 将数组分成两个子区间
    long long cnt = merge_sort(l, mid) + merge_sort(mid + 1, r);  // 对子区间递归排序,并计算逆序对数量

    int i = l, j = mid + 1, k = 0;
    while (i <= mid && j <= r) {  // 将两个有序子区间合并成一个有序序列,并统计逆序对数量
        if (a[i] <= a[j]) b[k++] = a[i++];
        else {
            b[k++] = a[j++];
            cnt += mid - i + 1;
        }
    }

    while (i <= mid) b[k++] = a[i++];
    while (j <= r) b[k++] = a[j++];
    for (i = l, j = 0; i <= r; i++, j++) a[i] = b[j];  // 将有序序列存回原数组

    return cnt;  // 返回逆序对数量
}

int main() {
    int T, n;
    cin >> T;
    while (T--) {
        cin >> n;
        for (int i = 0; i < n; i++) cin >> a[i];

        long long cnt = merge_sort(0, n - 1);
        cout << cnt << endl;
    }
    return 0;
}
		
	

下面是运行结果:

 

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

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

相关文章

ios app真机测试到上架App Store详细教程-必看

​转载&#xff1a;https://blog.csdn.net/p312011150/article/details/89374401 ios app真机测试到上架App Store详细教程-必看 Appuploader常见问题 转存失败 重新上传 取消 上架基本需求资料 1、苹果开发者账号&#xff08;如还没账号先申请-苹果开发者账号申请教程&…

​​​​魔兽服务端自定义创建传送门教程

魔兽服务端自定义创建传送门教程 大家好我是艾西,今天跟大家分享下魔兽自定义传送门怎么创建。玩过魔兽的朋友都知道,魔兽这游戏内容多地图也非常大,一个老魔兽玩家很熟悉跑副本的情况下从这个地图到下一个地图都得跑半个小时,更何况对于很多得新手小伙伴了,所有顾及到大…

CUDA编程之矩阵乘法

文章目录 一、矩阵乘法回顾二、CUDA内存架构CUDA中的共享内存CUDA中的共享内存使用方法静态申请内存动态申请内存 三、分解矩阵乘法 / 平铺矩阵乘法四、实战代码DS_M 和 DS_N的索引方式解释 一、矩阵乘法回顾 CPU版本&#xff1a; GPU版本&#xff1a; 核函数如下&#xff1…

JeecgBoot低代码平台—默认模糊查询以及高级查询规则

JeecgBoot低代码开发平台&#xff0c;自己封装了一套查询过滤器&#xff0c;默认就支持模糊查询&#xff0c;只是需要前后加上*&#xff0c;虽然麻烦&#xff0c;但是这样是考虑到系统后期数据量大默认模糊查询会导致系统性能问题。当然如果你的系统数据量级别达不到这个情况&a…

高校大数据实验室解决方案

高校实验室建设总目标是搭建一站式教学服务平台&#xff0c;一站式教学服务平台概念是在深刻理解高校学科建设及存在的若干问题上提出。围绕着学科建设的各个方面&#xff0c;从专业开设、课程设置、师资培养、教学资源、实验环境、学生实训实习及就业创业等环节&#xff0c;提…

Android热修复原理与实战

作者&#xff1a;独孤狼 什么是热修复 在我们应用上线后出现bug需要及时修复时&#xff0c;不用再发新的安装包&#xff0c;只需要发布补丁包&#xff0c;在客户无感知下修复掉bug 怎么进行热修复 服务端&#xff1a;补丁包管理 用户端&#xff1a;执行热修复 开发端&#xff1…

Introduction to modern Cryptography 现代密码学原理与协议第一章笔记

加密的语法由三个算法组成:密钥产生&#xff0c;加密&#xff0c;解密 (1) 密钥产生算法Gen是一个概率算法&#xff0c;能够根据方案定义的某种分布方案分布选择并输出一个密钥k (2) 加密算法Enc,输入为密钥k和明文m&#xff0c;输出为密文c。把使用密钥k加密明文m记为Enck(m) …

【Vue 基础】尚品汇项目-06-vuex模块式开发

vuex是官方提供一个插件&#xff0c;状态管理库&#xff0c;集中式管理项目中组件共用的数据。 目录 一、安装 二、vuex的基本使用 三、vuex模块式开发 一、安装 安装命令&#xff1a; npm install vuex3.6.2 --save 如果安装错版本&#xff0c;要先卸载再重新安装&#…

认识Filter(过滤器)

Filter介绍 在计算机编程中&#xff0c;Filter&#xff08;过滤器&#xff09;是一种用于对数据流进行处理的软件组件。Filter 的作用是从输入流中获取数据&#xff0c;对其进行处理后再将其写入输出流中。Filter 组件通常用于数据校验、数据转换、数据压缩等方面&#xff0c;…

微服务知识2

CAP和BASE是分布式必备理论基础 CAP理论 一致性(C)&#xff1a;写操作之后进行读操作无论在哪个节点都需要返回写操作的值 可用性(A)&#xff1a;非故障的节点在合理的时间内返回合理的响应 分区容错性(P)&#xff1a;当出现网络分区后&#xff0c;系统能够继续工作&#x…

家用平价洗地机哪款好?国产性价比高的品牌

在当今社会&#xff0c;人们使用清洁电器已经非常普及&#xff0c;成为了人们日常清洁中必不可少的得力助手了。洗地机在我看来&#xff0c;它在清洁力度上做的十分优秀&#xff0c;无论是干湿垃圾还是顽固污渍&#xff0c;皆可以清洗到位&#xff1b;同时&#xff0c;洗地机配…

《花雕学AI》AI 人工智能伙伴关系的指南:遵循原则,实现实践,展望未来

引言&#xff1a;人工智能&#xff08;AI&#xff09;是指由人造的机器或系统所展现出的智能&#xff0c;它可以模拟或扩展人类的认知功能&#xff0c;如学习、推理、感知、交流等。 人工智能的发展和应用已经深刻地影响了社会、经济、文化和政治等各个领域&#xff0c;同时也带…

( 数组和矩阵) 697. 数组的度 ——【Leetcode每日一题】

❓697. 数组的度 难度&#xff1a;简单 给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返回其长度。 示例 1&#xff1a; 输…

Java异常处理传递规范总结

java 异常分类 Thorwable类&#xff08;表示可抛出&#xff09;是所有异常和错误的超类&#xff0c;两个直接子类为Error和Exception&#xff0c;分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常&#xff0c; 这两种异常有很大的区别…

Linux 概述及常用命令(一)

1、Linux 简介 Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff08;主要用在服务器上&#xff09;&#xff0c;是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。 目前市面上较知名的发行版有&#xff1a;Ubuntu&#xff0c;RedHat&…

大学生创业者最关心的问题——校园外卖到底能不能盈利?

与前十年的寒窗苦读相比&#xff0c;大学自由散漫的生活略显空虚。除了学习&#xff0c;学生们还有很多时间自由安排。有些人选择颓废&#xff0c;有些人选择勤奋。而校园创业是许多有想法的大学生都会做的事情。其中&#xff0c;外卖跑腿配送是特别受欢迎的创业项目之一。 那…

五月到了,再来看看ChatGPT给我们带来了什么吧!

ChatGPT&#xff0c;即聊天生成预训练转换器&#xff08;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;是美国OpenAI公司基于GPT-3.5架构&#xff08;目前已经更新到GPT-4&#xff0c;但仅限于Plus用户&#xff09;研发和强化训练的一款人工智能聊天机器人…

C++学习day--04 图形化开发环境搭建

1、为什么要搭建图形化开发环境 因为很多初学者学习C就是单纯的控制台打印输出&#xff0c;很枯燥&#xff0c;我们今后在做项目或者在学习的过程中&#xff0c;采用图形化方式相结合的方法学习&#xff0c;再学习中体会编程带来的快乐。先说明一下&#xff0c;奇牛课程是边学…

YOLOv6 4.0 使用记录:python推理 OpenCV DNN 推理

目录 1、下载源码 2、下载权重文件 3、配置环境 4、推理 6、ONNX格式导出 权重文件为yolov6list_s.pt 权重为yolov6.pt 7、opencv DNN推理 8、个人总结 1、下载源码 下载最新的4.0版本的 2、下载权重文件 我下的是YOLOv6Lite-S 3、配置环境 cd到项目目录&#xff0c;运…

关于IDEA编译运行时出现 《非法字符: ‘\ufeff‘ 需要class,interface或enum》的解决办法

问题如下 原因&#xff1a;编码问题解决办法&#xff1a;将这些报错的文件拷贝到一个目录中&#xff0c;然后用notpad打开&#xff0c;点击工具类上的 编码&#xff0c;将 以uft8格式编码 转为 以utf8无BOM格式编码&#xff0c;然后保存&#xff0c;再覆盖idea中对应的文件。或…