火柴排队(逆序对 + 离散化)

505. 火柴排队

原题链接
在这里插入图片描述

思路

如下是画图分析的一些过程
在这里插入图片描述
在这里贪心的思路是排序,然后两个数组都是从小到大那样对应的话最终的答案可达到最小
而我们只能交换相邻的火柴,故在这里先假设一个简化版本,即A有序,而只需要对B进行操作,可发现,其实就是再在求逆序对数量在这里插入图片描述
有了简化版本思路,我们再对原数组进行处理,这里想到将其转化为简化版,也就是将原数组映射为排好序的1,2,3,…这样的数组,然后相应的也映射到B数组,随后就可以进行操作了
要注意的一点,数据过大,故先将a[], b[]数组进行离散化

离散化的话一般是从下标1开始的,故题目中最好也用下标从1开始

代码如下

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010, MOD = 99999997;
int n, a[N], b[N], c[N], p[N];  //这里的p数组可理解为临时数组,用来当作容器为其他数组服务
//c[]数组为映射数组

void work(int a[]) {
    for(int i = 1; i <= n; i++) p[i] = a[i];
    sort(p + 1, p + n + 1);
    for(int i = 1; i <= n; i++) a[i] = lower_bound(p + 1, p + n + 1, a[i]) - p;
}

int merge_sort(int l, int r) {
    if(l >= r)  return 0;
    int mid = l + r >> 1;
    //这里的分治区间别忘了累加res
    int res = (merge_sort(l, mid) + merge_sort(mid + 1, r) ) % MOD;
    int i = l, j = mid + 1, k = 0;
    while(i <= mid && j <= r) {
        if(b[i] <= b[j])    p[k++] = b[i++];
        else {
            p[k++] = b[j++];
            res = (res + mid - i + 1) % MOD;
        }
    }
    while(i <= mid) p[k++] = b[i++];
    while(j <= r) p[k++] = b[j++];
    for(int i = l, j = 0; i <= r; i++, j++) b[i] = p[j];
    return res;
}

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
    //首先,数据太大,进行数据的离散化(也是为了后期的映射对位)
    work(a), work(b);
    //然后,进行映射,将A数组映射为一个排好序的数组,B数组根据A数组数据也对应位置
    for(int i = 1; i <= n; i++) c[a[i]] = i;
    //对B的操作,在映射数组C[]中找b[i]的映射数据
    for(int i = 1; i <= n; i++) b[i] = c[b[i]];
    //最后,进行求最少交换次数(逆序对数量)
    int ans = merge_sort(1, n) % MOD;
    cout << ans;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt与人类有何不同?

ChatGPT和人类之间存在多个显著的差异。 首先&#xff0c;ChatGPT是一种基于人工智能技术的计算机程序&#xff0c;通过机器学习和自然语言处理等技术&#xff0c;从大量的数据中获取知识并生成语言输出。它主要依赖于算法和数据进行工作&#xff0c;能够迅速处理和检索信息&a…

MySQL为什么要用B+树?

二叉树&#xff08;二叉查找树&#xff09; 平衡二叉树&#xff08;B树就是B-树&#xff09;(解决了二叉查找树的极端情况&#xff09; Q&#xff1a;具体是怎么解决的呢&#xff1f; A&#xff1a; 树左右两边层数相差不大于1一旦符合条件1的时候&#xff0c;就进行左旋/右…

sql高级

sql高级 SQL SELECT TOP 子句 SELECT TOP 子句用于规定要返回的记录的数目。 SELECT TOP 子句对于拥有数千条记录的大型表来说&#xff0c;是非常有用的。 **注意:**并非所有的数据库系统都支持 SELECT TOP 语句。 MySQL 支持 LIMIT 语句来选取指定的条数数据&#xff0c; O…

掌握Linux之巅:RHCE认证快速攻略

在数字化时代&#xff0c;Linux系统已经成为企业级应用的重要支柱。RHCE&#xff08;Red Hat Certified Engineer&#xff09;认证&#xff0c;作为Linux领域的权威认证&#xff0c;不仅代表了专业技术的认可&#xff0c;更是职业发展的有力武器。本文将为你揭秘如何快速掌握Li…

信号处理--卷积残差网络实现单通道脑电的睡眠分期监测

目录 背景 亮点 环境配置 数据 方法 结果 代码获取 参考文献 背景 人类大约花三分之一的时间睡觉&#xff0c;这使得监视睡眠成为幸福感的组成部分。 在本文中&#xff0c;提出了用于端到端睡眠阶段的34层深残留的Convnet架构 亮点 使用深度1D CNN残差架构&#xff0…

XXE-XML实体注入漏洞

目录 1.xml基础 1.1什么是xml 1.2xml文档结构 1.3 什么是DTD 1.4 什么是实体 1.5 什么是外部实体 2.xxe漏洞 2.1xxe漏洞基本介绍 2.2xxe漏洞的危害 经典漏洞案例分析 3.xxe漏洞挖掘和利用 3.1. 识别潜在的XML入口 3.2. 检查XML处理逻辑 3.3. 构造试探Payload 常…

SpringBoot集成Kafka

Kafka是一种基于分布式发布-订阅消息系统的开源软件。 将消息存储在可配置数量的分区中&#xff0c;以便实现横向扩展&#xff0c;并且支持多个生产者和消费者&#xff0c;具有良好的可靠性保证机制。 Kafka还支持数据复制、故障转移和离线数据处理等功能&#xff0c;并被广泛应…

【面试必看!】如何介绍项目,如何陈述工作经历?

“简单介绍一下你的工作经历”&#xff0c;这是很多面试者在面试中遇到的第一个问题。因为现在招聘单位都很看重工作经验&#xff0c;尤其是软件行业&#xff0c;所以我想有必要在这里说一下如何在面试中陈述自己的工作经历。 在“说道理”之前&#xff0c;先举几个小例子&…

备战蓝桥(模板篇)

扩展欧德里几算法 质数筛 分解质因数 LCA BFS floyd Dijkstra prime 日期是否合法 Tire异或 模拟散列表 字符哈希 Tire字符串统计

【Linux篇】gdb的使用

&#x1f49b;不要有太大压力&#x1f9e1; &#x1f49b;生活不是选择而是热爱&#x1f9e1; &#x1f49a;文章目录&#x1f49a; 1. 背景知识2. 使用 1. 背景知识 1. 程序发布的方式有两种&#xff0c;debug模式和release模式 2. Linux下&#xff0c;gcc和g编译生成的可执行…

【MybatisPlus】QueryWrapper、UpdateWrappe、LambdaQueryWrapper、LambdaUpdateWrapper

一、Wrapper简介 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都是 MyBatis-Plus 框架中用于构建条件的工具类&#xff0c;它们之间的关系是继承关系。其中 QueryWrapper 和 UpdateWrapper 是基于普通的对象属性名来构建条件的&#xff0c;而 La…

mongo用命令将csv导入导出数据表

1、准备csv数据 2、新建数据库 数据库名&#xff1a;POIDB&#xff0c;用Robo数据库可视化软件操作的 3、命令行导入csv文件 命令模板 mongoimport --db mydatabase --collection mycollection --type csv --headerline --file data.csv导入kword文件命令&#xff0c;数据…

相机标定实验

相机标定 文章目录 相机标定1 ROS标定1.1安装标定程序1.2 下载标定板1.3 标定1.4 标定结果 2 Kalibr相机标定2.1 下载官方提供的标定板2.2 自定义标定板2.3 cam数据录制2.4 标定2.5 输出结果 3 MATLAB标定3.1 打开工具3.2 添加标定板图片3.3 设置标定参数3.4 生成标定结果3.5 标…

【网络原理】初识网络原理

目录 &#x1f384;网络发展史&#x1f338;独立模式&#x1f338;网络互连&#x1f33b;局域网LAN&#x1f33c;基于网线直连&#x1f33c;基于集线器组建&#x1f33c;基于交换机组建&#x1f33c;基于交换机和路由器组建 &#x1f33b;广域网WAN &#x1f333;网络通信基础&…

如何在小程序中绑定身份证

在小程序中绑定身份证信息是一项常见的需求&#xff0c;特别是在需要进行实名认证或者身份验证的场景下。通过绑定身份证信息&#xff0c;可以提高用户身份的真实性和安全性&#xff0c;同时也为小程序提供了更多的个性化服务和功能。下面就介绍一下怎么在小程序中绑定居民身份…

position定位学习

加了绝对定位的盒子不能通过margin:0 auto水平居中 脱标元素不会产生外边距合并问题

vue svelte solid 虚拟滚动性能对比

前言 由于svelte solid 两大无虚拟DOM框架&#xff0c;由于其性能好&#xff0c;在前端越来越有影响力。 因此本次想要验证&#xff0c;这三个框架关于实现表格虚拟滚动的性能。 比较版本 vue3.4.21svelte4.2.12solid-js1.8.15 比较代码 这里使用了我的 stk-table-vue(np…

Vue3实现页面跳转功能

目标&#xff1a; 首页&#xff1a; 点击About后&#xff1a; 第一步&#xff1a;安装 Vue Router和创建你先 npm install vue-router4第二步&#xff1a;在router.js中设置路由 import { createRouter, createWebHistory } from vue-router; import Home from ./views/Home…

HTML超详细简介

HTML是什么 超文本标记语言&#xff08;HyperText Mark-up Language &#xff09;用来设计网页的标记语言用该语言编写的文件&#xff0c;以 .html或 .htm为后缀由浏览器解释执行不区分大小写&#xff0c;建议小写 HTML标签 HTML用于描述功能的符号成为“标签”标签都封装在…

b站小土堆pytorch学习记录—— P25-P26 网络模型的使用和修改、保存和读取

文章目录 一、修改1.方法2.代码 二、保存和读取1.方法2.代码&#xff08;1&#xff09;保存&#xff08;2&#xff09;加载 3.陷阱 一、修改 1.方法 add_module(name: str, module: Module) -> None name 是要添加的子模块的名称。 module 是要添加的子模块。 调用 add_m…
最新文章