[CP] 学习记录——树状数组求逆序对个数
NOTE1: 本文并不包含树状数组的原理及实现。
NOTE2: 主要参考 树状数组 - OI Wiki 写成。
逆序对
对于给定数组
的数对。
使用暴力方法求逆序对个数
根据上述定义,可以很快写出暴力方法:
int cnt = 0; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (a[i] > a[j]) ++cnt; } }
时间复杂度
使用树状数组求逆序对个数
更快的方法是使用归并排序或树状数组,这里介绍后者。
权值数组
本方法的关键在于权值数组(如果之前学过桶排序应该很好理解)。对于数组
然而,如果我们一个个地向权值数组中添加元素呢?
回想先前的暴力做法,对于原数组的每个元素
注意到,逆序对定义中的两个条件并没有先后之分,所以我们反过来思考,可以找到所有满足
如果用权值数组来实现,因为权值数组的下标严格递增,故 “所有满足
那么,如何保证这个前提?只需要从原数组的最后一个元素开始,一个个地将其添加到权值数组中,直到第一个元素,同时在每次添加元素时将
因为修改权值数组会影响到
离散化
当输入数组
这一问题可以用离散化来解决。因为我们当前关注的是元素的相对大小关系,而不关心元素的值究竟是多少,所以可以计算出每个元素的相对索引。以数组
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)