求逆序对的三种姿势

洛谷P1774 

题目:登录 - Luogu Spilopelia​​​​​​

为什么最小的交换次数就是逆序对的个数,请看相关证明

1、归并排序

// 归并排序解法 
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 5e5 + 10;
typedef long long ll;
int a[N],b[N];
int n;
ll ans = 0;
void merge(int l,int r)
{if(l>=r) return;int mid = l + r >> 1;merge(l,mid),merge(mid + 1,r);int k = 0,i = l,j = mid + 1;while(i<=mid&&j<=r)if(a[i]<=a[j]) b[k++] = a[i++];else {ans += mid - i + 1;b[k++] = a[j++];}while(i<=mid)b[k++] = a[i++];while(j<=r) b[k++] = a[j++];for(int i = l,j = 0;i<=r;i++,j++) a[i] = b[j];
}
int main()
{scanf("%d",&n);for(int i = 0;i<n;i++) scanf("%d",&a[i]);merge(0,n-1);printf("%lld\n",ans);return 0;
} 

2、树状数组

进行离散化之后赋予排名,排名的数字越小,则说明数字越小,相同值的话先出现的排名数字越小。然后可以正着也可以反着进行求

// 树状数组的解法
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 5e5 + 10;
int tr[N],ranks[N];
int n;
struct Node
{int num,id;
}a[N];
bool cmp(Node &a,Node &b)
{if(a.num!=b.num)return a.num < b.num;return a.id < b.id;
}
int lowbit(int x){return x & -x;
} 
void add(int x,int v)
{for(int i = x;i<=n;i+=lowbit(i))tr[i] += v;
}
ll query(int x)
{ll res = 0;for(int i = x;i;i-=lowbit(i))res += tr[i];return res;
}int main()
{scanf("%d",&n);for(int i = 1;i<=n;i++) {scanf("%d",&a[i].num);a[i].id = i;}sort(a + 1,a + 1 + n,cmp);for(int i = 1;i<=n;i++) ranks[a[i].id] = i;ll ans = 0;// 正向求解 for(int i = 1;i<=n;i++){add(ranks[i],1);ans += i - query(ranks[i]);}/*反向求解 for(int i = n;i>=1;i--){add(ranks[i],1);ans += query(ranks[i]-1);}*/printf("%lld",ans);return 0;
}

3、线段树

离散化之后对每一个排名;

比如说当求到ranks[3] 的时候,看看在它之前有没有 4 - ----n的数字出现,询问以后,把update(ranks[3],1)加到线段树里面去,代表贡献了1.

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e6;
int ranks[N];
int sum[4*N];
struct Node
{int num,id;
}a[N];
typedef long long ll;
bool cmp(Node &a,Node &b)
{if(a.num!=b.num) return a.num < b.num;return a.id < b.id;
}
void pushup(int x)
{sum[x] = sum[x*2] + sum[x*2+1];
}
void build(int l,int r,int x)
{if(l == r) {sum[x] = 0;return;}int mid = l + r >> 1;build(l,mid,x*2);build(mid + 1,r,x*2 + 1);pushup(x); 
}
void update(int pos,int l,int r,int x,int v)
{if(l == r){sum[x] += v;return;}int mid = l + r >> 1;if(pos<=mid) update(pos,l,mid,x*2,v);else update(pos,mid + 1,r,x*2+1,v);pushup(x);
}
long long query(int pl,int pr,int l,int r,int x)
{if(pl<=l&&r<=pr) return sum[x];int mid = l + r>>1;long long ans = 0;if(pl<=mid) ans += query(pl,pr,l,mid,x*2);if(pr>mid) ans += query(pl,pr,mid + 1,r,x*2+1);return ans;
}
int main()
{int n;scanf("%d",&n);build(1,n,1);for(int i = 1;i<=n;i++){scanf("%d",&a[i].num);a[i].id = i;}sort(a+1,a+1+n,cmp);for(int i = 1;i<=n;i++)ranks[a[i].id] = i;ll ans = 0;n++;for(int i = 1;i<=n-1;i++){ans += query(ranks[i]+1,n,1,n,1);update(ranks[i],1,n,1,1);}printf("%lld",ans);return 0;
}

 

 

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

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

相关文章

MKP勒索病毒:了解.Henderson@cock.li.mkp变种,以及如何保护您的数据

尊敬的读者&#xff1a; 近年来&#xff0c;网络安全威胁不断涌现&#xff0c;其中勒索病毒尤其令人担忧。最新的一种名为[hudsonLcock.li].mkp、[myersairmail.cc].mkp、.Hendersoncock.li.mkp、[datastorecyberfear.com].mkp的勒索病毒已经开始在网络中传播&#xff0c;并且…

pyspark统计指标计算

下面介绍如何使用pyspark处理计算超大数据的统计指标&#xff0c;主要为&#xff1a;最大值、最小值、均值、方差、标准差、中位数、众数、非重复值等。 # 加载稽核数据 rd_sql f"select * from database.table" spark_data spark.sql(rd_sql)# 计算众数 由于spar…

Redis 工具类 与 Redis 布隆过滤器

Redis 工具类 1. 核心依赖 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>com.google.guava…

论文选题分享及思路(一)《基于C51单片机的自动化测量产线的设计》

论文选题分享及思路 题目 《基于C51单片机的自动化测量产线的设计》 核心&#xff1a;使用C51单片机按键控制传送带运动&#xff0c;并增加激光测量高度宽度功能及称重功能。 框架&#xff1a;摘要&#xff0c;题目背景&#xff0c;创新点&#xff0c;设计原理&#xff0c;程…

ubuntu解决“E: Unable to locate package lrzsz“

今天在ubuntu上安装rzsz包时报错&#xff0c;提示无法定位包&#xff0c;提示如下 出现这个问题是因为apt的源没有更新&#xff0c;我们直接说解决办法 把下面的命令执行一遍即可 sudo add-apt-repository main sudo add-apt-repository universe sudo add-apt-repository re…

fly-barrage 前端弹幕库(1):项目介绍

fly-barrage 是我写的一个前端弹幕库&#xff0c;由于经常在 Bilibili 上看视频&#xff0c;所以对网页的弹幕功能一直蛮感兴趣的&#xff0c;所以做了这个库&#xff0c;可以帮助前端快速的实现弹幕功能。 项目官网地址&#xff1a;https://fly-barrage.netlify.app/&#xff…

Redis信创平替之TongRDS(东方通),麒麟系统安装步骤

我的系统: 银河麒麟桌面系统V10(SP1)兆芯版 1.先进入东方通申请使用 2.客服会发送一个TongRDS包与center.lic给你(我这里只拿到.tar.gz文件,没有网上的什么安装版) 3.上传全部文件到目录中 4.服务节点安装,并启动 tar -zxvf TongRDS-2.2.1.2_P3.Node.tar.gz cd pmemdb/bin/…

QT入门看这一篇就够了——超详细讲解(40000多字详细讲解,涵盖qt大量知识)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …

MySQL5.7.24解压版安装教程

一、MySQL5.7.24解压版安装步骤 1.在指定目录下解压压缩包。比如在D:\Program Files\mysql下解压 2.在D:\Program Files\mysql\mysql-5.7.24-winx64目录下新建data文件夹&#xff0c;如果此目录下没有my.ini也需要手动创建 3.my.ini 文件配置内容如下 [mysqld] # 设置3306端口…

逻辑回归算法概述

逻辑回归算法概述 概述如何调用库函数选择适当的优化算法优化算法的作用逻辑回归 LogisticRegression 中优化算法的选择 其他机器学习算法&#xff1a;机器学习实战工具安装和使用 概述 逻辑回归是一种用于估计某种事物可能性的算法&#xff0c;可用于回归和分类任务。它通过历…

vue3使用百度地图

前情提要&#xff1a; 本文vue采用vue3框架&#xff0c;使用百度地图通过组件vue-baidu-map-3x&#xff1a; 组件官网&#xff1a;地图容器 | vue-baidu-map-3x 使用百度地图需要 申请百度地图AK秘钥 步骤&#xff1a;1.进入百度地图开放平台 | 百度地图API SDK | 地图开…

Nginx 配置前端工程项目二级目录

前提&#xff1a; 前端工程技术框架: vue 后端工程技术工程&#xff1a;spring boot 需求&#xff1a;需要通过二级目录访问前端工程&#xff1a; 如之前&#xff1a;http://127.0.0.1:80/ 改成 http://127.0.0.1/secondDirectory:80/ 一.前端工程支持二级目录 1.编译文…

三、矩阵基本知识

目录 1. 理解 2、矩阵的直观感受 3、矩阵与向量 1. 理解 ①矩阵是一个向量组&#xff0c;由许多 行向量 和 纵向量 组成。 ②矩阵方程求解 用增广矩阵初等变换化为 E 。齐次/非齐次方程组 的解用 初等变化 化为 行最简阶梯型。 ③初步认为由多元一次方程组的系数组成&…

petalinux_zynq7 驱动DAC以及ADC模块之六:qt显示adc波形

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

stm32看门狗

目录 一、看门狗介绍 二、看门狗分类 1、独立看门狗(Independent Watchdog,lWDG) 例程

【C++】——模板初阶 | STL简介

前言: 模板初阶 | STL简介 文章目录 一、模板初阶1.1 函数模板1.2 类模板 二、STL简介 &#xff08;了解&#xff09; 一、模板初阶 泛式编程&#xff08;Generic Programming&#xff09;指的是一种编程范式&#xff0c;其核心思想是编写可以在不同数据类型上通用的代码&#…

智能科技助力服装业:商品计划管理系统的革命性变革

随着智能科技的飞速发展&#xff0c;服装行业正在经历前所未有的变革。在这股浪潮中&#xff0c;商品计划管理系统的智能化转型成为了行业的核心驱动力。这种变革不仅极大地提高了服装企业的运营效率和市场竞争力&#xff0c;更为整个行业的可持续发展注入了新的活力。 智能商…

你听说过柔性数组吗?

目录 1. 柔性数组的概念 2. 柔性数组的特点 3. 柔性数组的使用 4. 柔性数组的优势 5.完结散花 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有帮助的话&#…

怎么理解ping?这是我听过最好的回答

晚上好&#xff0c;我是老杨。 Ping这几个字母&#xff0c;已经深入网工人的骨髓了吧&#xff1f; 把Ping用到工作里&#xff0c;肯定不少人在用&#xff0c;但对Ping的了解和理解是不是足够深&#xff0c;取决了你能在工作里用到什么程度&#xff0c;能让它帮你到什么地步。…

美格智能联合罗德与施瓦茨完成5G RedCap模组SRM813Q验证,推动5G轻量化全面商用

全球5G发展进入下半场&#xff0c;5G RedCap以其低成本、低功耗的特性成为行业焦点。近日&#xff0c;中国移动携手合作伙伴率先完成全球最大规模、最全场景、最全产业的RedCap现网规模试验&#xff0c;推动首批芯片、终端具备商用条件&#xff0c;RedCap端到端产业已全面达到商…