树状数组详解(求逆序对)

树状数组——求逆序对个数(初学者都能看懂) 在网上翻看了一些博客,感觉大体对于树状数组求逆序对的讲解不够详细,那些博客,更多像是给已经学会逆序对的人复习用的。而初学者,可能要冥思苦想。接下来,我便从一个初学者的角度,来一步步的,讲解一下由树状数组求逆序对。需要的前置知识只有,会线段数组的基本应用。单点更新,区间查询,求lowbit。 先贴树状数组的基本代码。 求lowbit int lowbit(x){return x&(-x);} 单点更新 void update(int x,int y,int n){ for(int i=x;i 阅读详情

前置芝士

单点修改和区间查询

引入

逆序对就是序列中 a i > a j a_i>a_j ai​>aj​ 且 i < j i<j i<j 的有序对,求一段正整数序列中逆序对的数目

比较容易想到使用归并排序解决,不过我们这次要用树状数组来解决。

树状数组解决逆序对

显然,以 a i a_i ai​为右端的逆序对数量即为 [ 1 , i − 1 ] [1,i-1] [1,i−1]中大于 a i a_i ai​的数的个数。我们用类似桶的思路来考虑:每次把 a i a_i ai​存入,就统计已存入的数中大于 a i a_i ai​的数的个数。使用树状数组维护。

注意到:

序列中每个数字不超过 1 0 9 10^9 109

需要离散化。

#include<iostream>
#include<cstdio>
#include<algorithm>
#define MAXN 500010
using namespace std;
int n,tot;
long long ans;
int a[MAXN];
int p[MAXN];
long long c[MAXN];
int lowbit(int x)
{
	return x&-x;
}
void update(int x,int k)
{
	for(;x<=tot;x+=lowbit(x))
		c[x]+=k;
}
long long query(int x)
{
	long long ans=0;
	for(;x>=1;x-=lowbit(x))
		ans+=c[x];
	return ans;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		p[i]=a[i];
	}
	sort(p+1,p+n+1);
	tot=unique(p+1,p+n+1)-p-1;
	for(int i=1;i<=n;i++)
		a[i]=lower_bound(p+1,p+tot+1,a[i])-p;
	for(int i=1;i<=n;i++)
	{
		update(a[i],1);
		ans+=query(tot)-query(a[i]);
	}
	printf("%lld",ans);
	return 0;
}
手把手教你搭建Howland电流源:从原理图到实测避坑指南(附Python数据分析) 本文详细介绍了Howland电流源的设计与实现,从原理图到实测避坑指南,涵盖电阻匹配、运放选择和PCB布局等关键环节。通过Python数据分析,展示了如何优化电路性能并解决常见问题,适合电子工程师和爱好者参考。 阅读详情

相关推荐

GD32F103VBT6串口OTA升级保姆级教程:当硬件没留Boot0引脚时,我是如何用Keil和Ymodem搞定的

本文详细介绍了GD32F103VBT6在无Boot0引脚情况下的串口OTA升级方案,通过Keil工程改造和Ymodem协议实现可靠固件更新。文章涵盖Bootloader配置、APP工程调整、Ymodem传输优化等关键步骤,为嵌入式开发者提供了一套完整的解决方案,特别适用于封闭式设备的远程更新需求。

weixin_28744613的博客 183

树状数组之求逆序对

树状数组之求逆序对 逆序对    设 A 为一个有 n 个数字的有序集 (n>1), 其中所有数字各不相同。 如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A [i] > A [j], 则 <A [i], A [j]> 这个有序对称为 A 的一个逆 序对,也称作逆序数。 例如,数组 (3,1,4,5,2) 的逆序对有 (3,1),(3,2),(4,2),(5,2), 共 4 个。 原理 我们有以下的设定 a[]={0,3,1,4,5,2} 其中 3,1,

DC_Fan的博客 2463

kali2020.2安装出现的问题并附详细解决办法

kali2020.2的安装

weixin_48776804的博客 3048

树状数组(求逆序对)

一、树状数组是什么 树状数组,又称二进制索引树,英文名Binary Indexed Tree 之前遇到一个求逆序对的题,看了很多题解都只说了这个树状数组,关于怎么实现的全都避而不谈,我研究了一下午,总算搞出个头绪了 一般用来求前缀和,可以把时间复杂度从O(n)降到O(log10 n)非常恐怖,举个例子,假如我们要求从1~1000的前缀和,普通方法需要遍历1000次,而树状数组只需要遍历5次,...

卑鄙的我 2万+

QT插件学习系列(一) 初识QtPlugin

QT插件学习系列(一) 初识QtPlugin 1、 概述 为什么我们要学习插件化,其和 windows 导出 dll 有什么区别呢? 导出的动态库如果缺失,程序不能运行。但插件可以。 同一套代码,即可分别在 windows 下和 linux 下生成插件。 QT 本身提供两种插件支持,一种称为高级 API,一种称为低级 API。 高级API的作用是扩展 QT 程序本身,需要子类化 QT 提供的插件基类,例如现有的 QTSqlDriver,因此你可也以编写自己的 QTStyle 扩展 QT。 低级

L_Andy的专栏 3113

FPGA工程师必看:JESD204B同步机制实战指南(含SYSREF信号调试技巧)

本文为FPGA工程师提供了一份JESD204B同步机制的实战指南,重点聚焦于SYSREF信号的调试技巧。文章从同步的核心逻辑出发,深入剖析了时钟、SYSREF与对齐序列这“三驾马车”的协作,并详细阐述了硬件PCB布局、FPGA IP核配置、状态机监控以及使用示波器进行波形分析等关键实战步骤,旨在帮助工程师解决多通道高速系统中的同步难题,确保链路的稳定与确定性延迟。

weixin_29239661的博客 331

逆序对问题(分治法,归并排序)

题目链接:https://www.luogu.com.cn/problem/P1908 题目描述 对于给定的一段正整数序列,求其中逆序对的数目。逆序对就是序列中 ai>aj且i<j的有序对。 分析 暴力法时间复杂度O(n2),数据规模大时不能AC。需要寻求一种分发高效的算法。考虑到逆序对也是一种有序对,可以采取一种边排序边计算的方法。归并排序是可以解决这个问题的。 #include&...

Simon的博客 1184

中兴SDH设备开局及业务配置

中兴SDH设备开局及业务配置 1.设备开局(S200-----S325) A.开电之后,按住截铃(bell off)开关,直至NCP告警灯变成橙色; B.此时,设备进入Download状态,设备IP为:192.192.192.11/24; 2.用交叉线(568A)将设备的QX口连接至电脑,电脑配置和设备相同网段的IP信息; 3.在电脑上测试连通性:pin...

weixin_33897722的博客 3997

逆序对数量

逆序对定义:对于给定的一段正整数序列,逆序对就是序列中 ai>aj, 且 i<j 的有序对 求一列数有多少对逆序对 例题: P1908 逆序对 #include<iostream> #include<string.h> #include<algorithm> #include<math.h> using namespace std; const int N=500010; int n,a[N],tmp[N]; long long ans=0; .

samamthawyy的博客 421

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

3055

FPGA实现PCIe接口

PCI Express(PCIe)是一种高速串行计算机扩展总线标准,在FPGA中实现PCIe接口可以实现与主机系统的高速数据通信。以下是FPGA实现PCIe接口的关键技术要点。

whm128的博客 1460

树状数组简单总结(原理见以往帖子)

树状数组:快速(动态)求前缀和 在线算法(支持修改) O(logn) 1:给某个位置上的数加上一个增量(修改某个元素) 2:求某个前缀和 即:单点修改,区间查询(sum(r)-sum(l-1)) 树状数组只能支持这俩问题,别的问题都得通过转化才能解决 比如区间修改,单点查询 需要利用差分转化为区间修改 记树状数组为C[x],定义: C[x]=(x-lowbit[x],x],即x-lowbit[x]+1~x,奇数为其本身 lowbit[x]=x&-x,含义是2^k,k为x...

明月千里赴迢遥的博客 681

GPU服务器维修全流程:从检测到解锁

《GPU服务器维修维保全流程指南》摘要:本文系统介绍GPU服务器从检测到解锁的完整维修流程。检测环节包含物理检查(氧化层、散热、PCB板)和电子诊断(ECC报错率、电源波动等);核心维修技术涵盖PCB板修复(微孔镀铜、BGA返修)和芯片级维修(成功率78-92%);解锁验证阶段包括性能解锁(VBIOS重写)和72小时稳定性测试。文末提供故障速查表及维保建议,强调定期除尘可降低38%故障率,推荐环境粉尘浓度控制在≤0.3mg/m³。

2401_89353317的博客 890

树状数组求逆序对详解

树状数组通用模版 class BIT { int n; //这个是外部传进来数组的大小 int[] c; //这个是预处理的树状数组 public BIT(int n) { this.n = n; c = new int[n + 1]; //树状数组一定要开n+1,从1开始,不然的话 ,add...

0xac001d09 1092

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

树状数组详解(处理在线数据,求逆序对)

一、树状数组概论。 一、1 树状数组C[I]含义 一、2A数组重要吗 二、树状数组的用途(重点阐述,原理请看后文或参看别人的BLOG) 二、1:插入点,查询区间 二、2:修改区间,查询点 三、操作与应用 三、1:以在线求累加和为例 三、2:树状数组求逆序对 四、代码实现 四、1:插入点,查询区间 四、2:修改区间,查询点 五、练习 六、原理详解

MopTrain的博客 652

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

树状数组(Binary Index Tree) ---------这是一类用以解决动态前缀和的问题 (有点像线段树简版) **1.对于 a1 + a2 + a3 + … + an 1)询问 aj + … + am (1 <= j <= m <= n ); 2) 修改 ai ( 1<= i <= n); (yxc大佬说任何问题都要树立暴力思想) 那么暴力的复杂度是多...

weixin_45630722的博客 450

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

四、P1908 逆序对 (树状数组包懂!!!)

两种方法,树状数组极详细

xiaolongmeiya的博客 948

树状数组求逆序对 poj2299

树状数组求逆序对; 对于一组任意顺序的数,记下他们的初位置,再进行排序,记下他们本来应该在的位置。然后,按最初位置从前往后,进行处理。 基本思想: 对于一个数要求它对应得逆序对,可以通过求前面小于等于它的数的个数,然后用当前已处理的数的个数-前面小于等于当前的数的个数得到。 如: 4 3 5 2 1 排序后 1 2 3 4 5 对于第一个数4,当前处理数的个数为1,本来应该在的位置是4,则在第4个...

weixin_43184669的博客 206

树状数组求逆序对数

再清楚地打一边用树状数组求逆序对,记不住就只能多打,万事唯手熟耳。 这里都用的int,实际题目数据要求会不一样,必要时用long long int。这里的一步离散化的作用是如果数列中元素的大小比较大就不易直接开大小范围的树状数组来做,而是先按元素值排序然后比较的是元素原来的index,道理是一样的。 #include &lt;iostream&gt; #include&lt;stdio.h&...

XiaoPANGXia的专栏 1599

逆序对问题

三种解决方法 暴力 分治 树状数组 逆序对的三种求法 这篇博客写得很不错,分治法网上有一大堆,这里仅仅对树状数组求法进行补充。 对于一个序列5 2 1 4 3,开一个数组d,d[i]表示i出现的次数。这个算法需要对一段区间内进行求和,使用树状数组可以加速这个过程。 如果对树状数组算法不太明白,可以参考这个视频,讲得很清楚,也很好理解。 树状数组视频讲解 ...

m0_51267207的博客 202

多校2 hdu 6318 Swaps and Inversions (树状数组求逆序对)

题目链接:哆啦A梦传送门 题意:给你一串序列,让你重排,求这个序列的最小花费,有两种方法求,1,求逆序对的数*x,2,交换相邻的数字,每次交换需要花费y。   题解:我们知道每次交换相邻的数字,会使这串序列的逆序对数+1或者-1,故我们最终的结果是求逆序对数然后乘以min(x,y)。 求逆序对数,因为这里的数太大了,故不能像之前那样求,直接按值树状数组,所以我们这里就按位置树状数组。  ...

Jiandong 277

Day2:T4求逆序对(树状数组+归并排序)

T4: 求逆序对 A[I]为前缀和 推导 (A[J]-A[I])/(J-I)>=M A[j]-A[I]>=M(J-I) A[J]-M*J>=A[I]-M*I 设B[]=A[]-M*(); B[J]>=B[I] 也就是求逆序对; 求逆序对的方法主要有两种: 归并排序; 树状数组; 这里两种方法都学习一下: 1.之前对于树...

weixin_30568715的博客 104

自用备忘录2———树状数组

lowbit(x)计算的结果是2^k,其中k为x在二进制表示下末尾0的个数 int lowbit(int x){ return x&(-x) } 树状数组模板: #include<stdio.h> #include<string.h> int a[10005]; int c[10005]; int n; int lowbit(int x){ return x&(-x); } int getSum(int x){ int ans =

weixin_63600245的博客 301

树状数组求逆序对

…话说这不应该是学语言的时候学的嘛…#include <cstdio> #include <algorithm>#define Rep( i , _begin , _end ) for(int i=(_begin);i<=(_end);i++) #define For( i , _begin , _end ) for(int i=(_begin);i!=(_end);i++) #define Lop

没有听众的演讲 413

【树状数组 求逆序对】排序

首先需要了解逆序对是什么:逆序对就是如果i &gt; j &amp;&amp; a[i] &lt; a[j],这两个就算一对逆序对。其实也就是对于每个数而言,找找排在其前面有多少个比自己大的数。那么思路就来了,树状数组又一次地优化了这种“需要遍历”的情况。那不就很容易了吗?依次把序列里的数放到树状数组中的A[i]上去(实际是以C[i]形式的插入函数),注意A[i]是以数值大小从小到大排列的。先插入...

It's the Climb 1万+
上一篇: 树状数组详解(区间修改和区间查询)
下一篇: AC自动机详解
Wu_while
博客等级 码龄6年 50粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值