树状数组详解(区间修改和区间查询)

【代码超详解】LOJ #132. 树状数组 3 :区间修改,区间查询 一、题目描述 样例 样例输入 5 10 2 6 6 1 1 2 1 4 1 2 5 10 2 1 3 2 2 3 1 2 2 8 1 2 3 7 1 4 4 10 2 1 2 1 4 5 6 2 3 4 样例输出 15 34 32 33 50 二、算法分析说明与代码编写指导 如果不了解树状数组,建议先阅读之前的题解: https://blog.youkuaiyun.com/COFACTOR/arti... 阅读详情
AI摘要

本文介绍了树状数组在处理区间修改和区间查询问题中的应用,通过实例展示了如何利用树状数组解决此类问题,并提供了完整的代码实现。通过对数列进行差分操作,维护两个树状数组,分别存储数列的累积和与累积乘积,从而高效地完成区间操作。

前置芝士

单点修改和区间查询
区间修改和单点查询

引入

例题:(洛谷 P3372 【模板】线段树 1)

已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数加上 k k k。
2.求出某区间每一个数的和。

这是线段树的模板题,然而我们要用树状数组去做它!

可以看出这题就像是 单点修改区间查询 和 区间修改单点查询 的升级版,好,那我们就顺着这两道题的思路继续走。

区间修改和区间查询

我们还是利用差分,可以得:

∑ i = 1 n a i = ∑ i = 1 n ∑ j = 1 i b j = n × b 1 + ( n − 1 ) × b 2 + . . . + b n = n × ∑ i = 1 n b i − ∑ i = 1 n [ b i × ( i − 1 ) ] \begin{aligned}\sum\limits_{i=1}^n a_i&=\sum\limits_{i=1}^n\sum\limits_{j=1}^i b_j\\&=n×b_1+(n-1)×b_2+...+b_n\\&=n×\sum\limits_{i=1}^n b_i-\sum\limits_{i=1}^n [b_i×(i-1)] \end{aligned} i=1∑n​ai​​=i=1∑n​j=1∑i​bj​=n×b1​+(n−1)×b2​+...+bn​=n×i=1∑n​bi​−i=1∑n​[bi​×(i−1)]​

方法就显而易见了:维护两个树状数组,一个维护 ∑ i = 1 n b i \sum\limits_{i=1}^n b_i i=1∑n​bi​,一个维护 ∑ i = 1 n b i × ( i − 1 ) \sum\limits_{i=1}^n b_i×(i-1) i=1∑n​bi​×(i−1)。

而维护 ∑ i = 1 n b i × ( i − 1 ) \sum\limits_{i=1}^n b_i×(i-1) i=1∑n​bi​×(i−1) 只需在把 k k k 加到 x x x 位置时将树状数组加 k ∗ ( x − 1 ) k*(x-1) k∗(x−1) 即可。

完整代码

#include<iostream>
#include<cstdio>
#define MAXN 1000010
using namespace std;
int n,q,op,l,r,x;
int a[MAXN];
int c1[MAXN],c2[MAXN];
int lowbit(int x)
{
	return x&-x;
}
void update(int x,int k)
{
	int t=x;
	for(;x<=n;x+=lowbit(x))
	{
		c1[x]+=k;
		c2[x]+=k*(t-1);
	}
}
int query(int x)
{
	int ans=0,t=x;
	for(;x>=1;x-=lowbit(x))
		ans+=c1[x]*t-c2[x];
	return ans;
}
int main()
{
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		update(i,a[i]-a[i-1]);
	}
	for(int i=1;i<=q;i++)
	{
		scanf("%d%d%d",&op,&l,&r);
		if(op==1)
		{
			scanf("%d",&x);
			update(l,x);
			update(r+1,-x);
		}
		else
			printf("%d\n",query(r)-query(l-1));
	}
	return 0;
 } 

注:过线段树1得开long long

【代码超详解】LOJ #131. 树状数组 2 :区间修改,单点查询 一、题目描述 样例 样例输入 3 2 1 2 3 1 1 3 0 2 2 样例输出 2 二、算法分析说明与代码编写指导 如果你尚不了解树状数组,建议先阅读以下题解: (LOJ 130) https://blog.youkuaiyun.com/COFACTOR/article/details/104199313 通过原数组构造差分数组,然后用这个差分数组建立树状数组,其前 i 项和即为原数组的第 i ... 阅读详情

相关推荐

树状数组原理详解:从前缀和到lowbit,单点修改区间查询的O(log n)利器

在算法与数据结构学习中,前缀和能高效处理静态区间求和,但面对高频单点修改时却面临O(n)更新的瓶颈。树状数组(Fenwick Tree)通过二进制lowbit机制,将数组下标按最低位1划分为若干管辖区间,使得单点修改和前缀查询都能在O(log n)时间内完成。其核心思想在于:利用整数二进制位数有限这一天然约束,将原本线性的更新链压缩为不超过log n次的跳跃路径。这种结构不仅代码极短、常数小,更在离散化、逆序对统计、动态第k小等场景中成为经典解法。理解树状数组的二进制下标设计,是掌握这一高效数据结构的关键入

weixin_30983353的博客 237

树状数组的区间修改与区间查询

数据结构——树状数组的一个应用:区间修改与区间查询

IDDFS 2102

检索增强世界模型(R-WoM)原理与应用实践

世界模型是AI系统理解环境的核心技术,通过构建环境的内部表示实现状态预测和行动规划。传统方法基于RNN或VAE等神经网络,而检索增强世界模型(R-WoM)创新性地引入检索机制,结合外部记忆库提升系统性能。这种架构突破模型参数限制,使AI能像人类一样利用历史经验解决问题,在游戏AI、虚拟助手等场景表现优异。关键技术包括FAISS相似性搜索、分层记忆管理和动态检索策略,其中Transformer编码器和GRU动态模型的组合实现高效环境建模。实践表明,该方法可提升47%的战术多样性,加快32%的应急响应速度。

weixin_42676876的博客 341

树状数组:区间修改 + 区间查询

树状数组的与。

m0_72761451的博客 1716

数字IC后端PPA优化实战:Timing一致性策略与Module Region布局技巧

本文深入探讨了数字IC后端设计中的PPA优化实战,重点解析了Timing一致性问题及其解决方案。通过调整Clock Uncertainty、Timing Derate和RC Scale Factor等关键参数,使Innovus等PR工具的分析结果更接近PrimeTime签核结果。同时,文章详细介绍了Module Region布局技巧,通过为关键模块划定物理区域,优化单元摆放,有效减少线延迟,从而协同提升时序收敛效率与设计可预测性。

weixin_29218963的博客 203

VisualStudio2022配置CGAL

vs2022和vs2017安装配置boost没什么区别,只需要注意boost的msvc得是14.3的,这玩意跟visualstudio版本挂钩的。压缩包解压,得到下面这两文件,然后把auxiliary这个文件挪到CGAL-5.6里面就行了。我用cgal读取一个stl模型,并输出相关信息(想可视化的话需要安装Qt,不想装Qt也可以装VTK)然后下载下面这两个压缩包。照着下面的截图填就完事了。

weixin_43850909的博客 1171

树状数组(单点修改+单点查询+区间修改+区间查询)

树状数组(单点修改+单点查询+区间修改+区间查询)

水,全都是水 3223

价值微笑曲线与AI公司的位置

1. 背景介绍 1.1 问题由来 自20世纪60年代,哈佛大学商学院教授西奥多·波特提出了“价值链”理论以来,企业如何构建竞争优势成为企业经营管理领域的研究重点。随着全球化的发展和科技进步,企业竞争环境发生了深刻变化,传统价值链管理模式逐渐显现出局限性。近年来,全球竞争格局由成本竞争转向创新竞争,企业的生存

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 1095

树状数组(区间修改,区间查询)

本题链接:用户登录 树状数组的区间修改,区间查询,操作起来有点繁琐了些,但还是可以理解的。这里区间修改,我们还是需要需要通过差分来进行区间修改的。不同的是,在于区间查询这一块。我们先模拟一遍区间修改后,差分数组 dif,原数组 a得: 差分数组的前缀和,就是获得当前原数组的数值 而我们需要求的是区间和,所以当我们设区间和数组为 sum可知 所以,当我们区间查询区间求和的时候可以得出,我们区间求和,相应的差

Angindem博客 1300

化工设计软件:AutoCAD Plant 3D二次开发_(1).AutoCADPlant3D概述

AutoCAD Plant 3D 是一款专为化工行业设计的三维工厂设计和建模软件。它基于AutoCAD平台,提供了强大的三维建模功能和专业的化工设计工具,帮助工程师和设计师在工厂设计过程中提高效率和准确性。AutoCAD Plant 3D不仅能够创建详细的三维模型,还可以进行管道设计、设备布置、支架设计等复杂任务。通过上述案例,我们可以看出 AutoCAD Plant 3D 在化工厂设计中的强大功能和优势。该软件不仅提供了丰富的建模工具和专业的设计功能,还支持二次开发,使用户能够根据具体需求进行定制化操作。

kkchenjj的博客 1103

【EDA Tools】Spyglass 检查 Verilog 和 SystemVerilog 混合语言及 Lint 检查

Spyglass可以用于检查混合设计中的语言互操作性和一致性问题。对于设计中包含多种硬件描述语言的情况,Spyglass 能够识别并解析其中的模块及其互连,并对其进行验证。例如,在包含 Verilog 和 VHDL 的混合设计中,Spyglass 会自动识别并解析 Verilog 和 VHDL 文件及其相互连接。通过运行 Spyglass Lint 功能,可以检查混合设计中的语言一致性问题,例如不兼容的数据类型、互操作性问题以及其他可能导致设计故障或不一致的问题。

记录学习历程 5080

树状数组详解(单点修改和区间查询)

我们来看下面的例题: 已知一个数列,你需要进行下面两种操作: 1.单点修改:将某一个数加上 x 2.区间查询:求出某区间每一个数的和 我们有哪些方法呢? 暴力。单点修改的时间复杂度为O(1),区间查询的复杂度为O(n)。 前缀和。单点修改的时间复杂度为O(n),区间查询的复杂度为O(1)。 我们可以看到,两种做法都有一个操作是O(1)的,但也都有一个操作是O(n)的。 那有没有什么两全其美的做法呢?当然有了。有的人可能就会喊了:线段树! 线段树固然好,但它也有它的缺点:算法常数大,编写难度高。 那就

Wu_while的博客 1108

YOLO11 改进 - C2PSA | C2PSA融合HEWL(高频增强小波层):小波逆变换+双通道注意力增强+高频显式增强 | TGRS 2026

本文介绍了高频增强小波层(HEWL),一种专为解决红外小目标检测中边缘退化与语义模糊问题设计的上采样模块。该方法结合小波逆变换与交替通道注意力(ALCA),通过显式增强高频细节并优化特征融合,实现精准的边缘重建与语义对齐。我们将 HEWL 融入 PSABlock 结构构建了 C2PSA_HEWL 模块,并成功集成进 YOLO11 的骨干网络,替代原有的 C2PSA 模块。实验证明,结合 HEWL 的 YOLO11 在检测任务中表现优异,有效提升了模型对细节特征的捕捉能力。

魔改工程师的博客 102

树状数组实现区间修改与单点查询详解

树状数组(Fenwick Tree)是一种高效处理前缀和操作的数据结构,通过巧妙的二进制索引设计,能在O(logn)时间复杂度内完成单点更新和前缀查询。其核心技术价值在于将线性复杂度操作优化至对数级别,特别适合处理大规模数据场景。结合差分数组思想,树状数组可以高效实现区间修改操作,这在算法竞赛题目如洛谷P3368中有着典型应用。实际工程中,这种技术广泛用于时间序列分析、游戏开发等领域,通过差分转换将区间修改变为两个单点操作,配合树状数组的前缀求和特性,能显著提升批量数据处理的效率。掌握树状数组与差分技巧的组

weixin_30512965的博客 280

基于分水岭分割进行肺癌诊断

近年来,肺癌的发病率和病死率均迅速上升,目前已居所有癌症之首。随着肺癌病人数量的增加,医生对肺部 CT 图像进行研判的工作量也增加了不少,在这种情况下难免工作效率降低甚至会出现误诊。为了帮助医生减少重复性工作,对肺部 CT 图像进行计算机辅助检测的技术就被广泛应用于对肺癌的诊断和治疗过程中。医学 CT 图像处理主要是研究医学图像中的器官和组织之间的关系,并进行病理性分析。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1568

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

树状数组详解(区间修改和单点查询)

前置芝士 单点修改和区间查询 引入 先看例题:(洛谷 P3368 【模板】树状数组 2) 已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上 xxx; 2.求出某一个数的值。 这题和 树状数组1 有什么区别? 没错,正如题目所说,这题是区间修改和单点查询! 区间修改和单点查询 区间修改和单点查询要怎么实现呢?这需要用到一个东西:差分。 差分是什么呢?(知道的大佬可以跳过) 对于一个数组a[]a[]a[],我们设它的差分数组为b[]b[]b[],则满足: b[1]=a[1]b[1]=a[1

Wu_while的博客 1748

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

树状数组:单点修改,区间查询(详解)

问题的提出 : 给定一个序列 a,可以进行两种操作: 1 i x :给定 i , x, 将 a[i] 加上 x; 2 l r :给定 l , r, 求 a[l] + a[l + 1] + ··· + a[r + 1] 的值 (单点修改,区间查询) 首先,我们会想到直接用一个现行的数组。那么单点修改的时间复杂度将是 O(1)O(1)O(1),但是区间查询的时间复杂度却是 O(n)O(n)O(n), 数据范围一大,就很有可能会超时。 那么,又有人会想到用一个前缀和数组,但是有没有想过,虽然区间查询的时间复

C202220yanglin的博客 1290

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

树状数组:区间修改,单点查询(详解)

我已经在上一篇博客 《树状数组:单点修改,区间查询(详解)》中介绍了树状数组,并且讲解了一道例题。今天就再来看一道题: 题目描述 给定数列 ,你需要依次进行 q个操作,操作有两类: 1 l r x:给定 ,对于所有 ,将 加上 (换言之,将 分别加上 ); 2 i:给定 ,求 的值。 输入格式: 第一行包含 2 个正整数 ,表示数列长度和询问个数。 第二行 n个整数 ,表示初始数列。 接下来 q 行,每行一个操作,为以下两种之一: 1 l r x:对于所有 ,将 a[r] 加上 x ; 2 i :给

C202220yanglin的博客 1002

树状数组详解!(C++_单点/区间查询_单点/区间修改)

先把这张著名的树状数组结构图摆在最前面,接下来我们就以这张图讲起!        首先图中的A数组就是所谓的原数组,也就是普通的数组形态,C则是我们今天要说的树状数组(可以看出一个数的形状,但其实和树没多大关系) 从图中可以明显看到以下几个式子: C[1]=A[1];C[1]=A[1];C[1]=A[1]; C[2]=C[1]...

ccql's Blog 1351

关于树状数组区间修改和查询详解

原版介绍 这里我想再加上自己的理解,解释一下。 现在我们需要的是把某个区间的值修改,然后查询 我们设原数组为 a[1] a[2] …. a[n] 我们添加一个c1数组 来记录此项与前一项的差值 即 c1[i] = a[i] - a[i-1] 再添加上c2数组,根据公式c1与c2的关系(下面会说到) c2[i] = (i-1)*(a[i] - a[i-1]) 下面是推导

无知而狂妄 513

树状数组—区间修改+单点查询 详解

看了很长时间大佬的博客,终于明白了区间修改和单点查询的原理,因为大佬们的思维比较强大,所以菜鸡决定写一篇较为详细的解释。 首先引入差分数组d,设原数组为a,令d[i]=a[i]-a[i-1].由此关系式得,也就是a[j]等于d[j]的前 j 项和,即前缀和。 于此,我们的树状数组维护的是 d 的前缀和。 1、单点查询: 有以上推理得,查询a[i]相当于查询b[i]的前...

weixin_30847939的博客 191

poj3468 A Simple Problem with Integers(树状数组区间修改,区间查询详解)

A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 172750 Accepted: 53177 Case Time Limit: 2000MS Description You have N integers, A1, A2, … , AN. You need to...

weixin_43736492的博客 300

树状数组总结——详解(单点/区间查询, 单点/区间修改, 逆序对)

1、概述   树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,怎样才能快速地获取连续几个数的和? 2、树状数组基本操作   传统数组(共n个元素)的元素修改和连续元素求和的复杂度分别为O(1)和O(n)。树状数组通过将线性结构转换成伪树状结构(线性结构

wzw-yali的博客 1072

树状数组详解:从lowbit原理到单点修改区间查询实战

树状数组是一种高效维护动态序列区间和的数据结构,其核心思想源于二进制拆分。通过 lowbit 运算确定每个节点管辖的区间范围,使得单点修改与区间查询都能在对数时间内完成。相比朴素数组和前缀和,树状数组在动态更新场景下兼顾了修改与查询的效率;相比线段树,它代码量少、常数小,非常适合处理大量“单点修改、区间查询”类问题。本文从 lowbit 原理出发,讲解树状数组的管辖范围、add 与 query 的路径规律,并通过完整模板题演示建树与查询过程,同时整理常见踩坑与调试技巧,帮助读者彻底掌握这一经典数据结构。

weixin_32576389的博客 206
上一篇: 树状数组详解(区间修改和单点查询)
下一篇: 树状数组详解(求逆序对)
Wu_while
博客等级 码龄6年 50粉丝 53原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值