当前位置: 首页 > news >正文

超详细树状数组讲解(+例题:动态求连续区间和)

树状数组的作用:

  1. 快速的对数列的一段范围求和

  1. 快速的修改数列的某一个数

为什么要使用树状数组:

大家从作用中看到快速求和的时候

可能会想到为什么不使用前缀和

只需要预处理一下就可以

在O(1)的时间复杂度下实行对于数列的一段范围的和

但是我们可以得到

当我们需要进行功能不仅含有

范围求和

还要求在同时对于

数列的某个数进行修改的时候

我们每次修改后还需要再求一次前缀和

这样的话时间复杂度最坏就达到了O(n)

所以我们就需要用到树状数组去实现这些功能

树状数组与线段树的区别:

他们之间的关系可以用包含关系来描述

也就是线段树包含了树状数组能够使用的功能

但树状数组的使用比线段树的使用快了很多倍

树状数组就像是一个专精的工具

效率高,但利用面相对于线段树不广。

树状数组的注意点以及图解:

注意点:

  1. 树状数组的下标为从1开始

  1. 对于树状数组的实现,我们通常采用一维数组来存储数列,其中奇数下标都为树状数组的第零层(也就是log2(lowbit(i))层),偶数下标为树状数组的log2(lowbit(i))层

  1. 提前创建两个数组:a[N]存原来给定的序列,tr[N]存构建的树状数组

构建的树状数组的详细图:

树状数组实现(3个核心函数):

函数一(lowbit()函数)

其中lowbit的作用是求二进制下最低位的1后面有多少个0
假如有k个0,那么就会返回2^k
具体实现:
int lowbit(int x){return x&(-x);
}//&是二进制的每个数位“与”的结果
//例如 0&1=0 0&0=0  1&1=1

函数二(add()函数)

对于add函数他主要的作用就是
用来修改某一个位置上元素的值
当然我们在构建树状数组的时候
就可以用该函数去构建树状数组
具体实现:
void add(int x,int v){for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=y;
}

函数三(query()函数)

对于query函数他主要的作用就是
用来询问前i个元素的和
我们一般用query(r)-query(l-1)来表示[l,r]区间的和
具体实现:
int query(int x){int sum=0;for(int i=x;i>=1;i-=lobit(i)) sum+=tr[i];return sum;
}

题目:动态求连续区间和

题目详细:

代码详解:

#include<iostream>
using namespace std;const int N=1e5+6;int a[N],tr[N];
int n,m;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;
}int query(int x){int res=0;for(int i=x;i;i-=lowbit(i)) res+=tr[i]; return res;
}int main(){cin>>n>>m;for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) add(i,a[i]);while(m--){int k,x,y;scanf("%d%d%d",&k,&x,&y);if(1==k) add(x,y);else printf("%d\n",query(y)-query(x-1));}return 0;
}

相关文章:

超详细树状数组讲解(+例题:动态求连续区间和)

树状数组的作用&#xff1a;快速的对数列的一段范围求和快速的修改数列的某一个数为什么要使用树状数组&#xff1a;大家从作用中看到快速求和的时候可能会想到为什么不使用前缀和只需要预处理一下就可以在O(1)的时间复杂度下实行对于数列的一段范围的和但是我们可以得到当我们…...

【学习笔记】AGC055

A - ABC Identity 如果只有AAA,BBB两种字符的话&#xff0c;我们发现要寻找p∈[1,n]p\in [1,n]p∈[1,n]&#xff0c;使得[1:p][1:p][1:p]中AAA的数目与[p1:n][p1:n][p1:n]中BBB的数目相同。 如果有A,B,CA,B,CA,B,C三种字符&#xff0c;我们可以先将A,BA,BA,B分离出来&#xf…...

墨者——内部文件上传系统漏洞分析溯源 内部文件上传系统漏洞分析溯源

墨者——内部文件上传系统漏洞分析溯源 内部文件上传系统漏洞分析溯源 1.选择合适的文件上传 2.可以看到为*.asp文件 3.可以推测出此站点为IIS 4.上传shell.asp试试 5.上传报错&#xff0c;将其改名为shell.asp.txt上传&#xff0c;发现上传成功 6.有个问题就是服务器将我们所…...

5.2 Python if语句

5.2.3 检查是否不相等要判断两个值是否不等&#xff0c;可结合使用惊叹号和等号(!)&#xff0c;其中的惊叹号表示不&#xff0c;在很多编程语言中都如此。下面再使用一条if语句来演示如何使用不等运算符。我们将把要求的比萨配料存储在一个变量中&#xff0c;再打印一条消息&am…...

ubuntu gerrit 配置

1 - 简介 参考地址: https://www.cnblogs.com/anliven/p/12019974.html https://www.cnblogs.com/anliven/p/11980432.html 虽然Gerrit 本身提供 Code Review和 Git 仓库的两大功能,但实际上很多项目用的是其他的Git仓库,例如GitLab和GitHub。 一般情况下,Gerrit位于最终…...

运动蓝牙耳机什么牌子好,运动蓝牙耳机品牌推荐

现在市面上运动耳机的品牌越来越多&#xff0c;还不知道选择哪一些运动耳机品牌&#xff0c;可以看看下面的一些耳机分享&#xff0c;运动耳机需要注意耳机的参数配置以及佩戴舒适度&#xff0c;根据自己最根本的使用需求来选择运动耳机。 1、南卡Runner Pro4骨传导蓝牙运动耳…...

(7)C#传智:方法及参数、重载(第7天)

一、方法作用域 被调用者需要调用者的值,方法有二: 1.传参数. private static void Main(string[] args){int m 3;Console.WriteLine(m);Console.ReadKey();}public static int GetMax(int m){return m 3;} 2.使用静态字段模拟全局. 多个方法都需要时&#x…...

Python 函数式编程

函数式编程&#xff1a;允许把函数本身作为参数传入另一个函数&#xff0c;还允许返回一个函数&#xff01; 1.高阶函数 一个函数可以接收另一个函数作为参数&#xff0c;这种函数称之为高阶函数 abs(-10) 是函数调用 abs是函数本身 abs函数名其实是一个变量名 变量可以…...

pandas读取EXCEL列名重复问题解决——pandas设置多行为列名(多层列名)

问题呈现 这是我在问答区看到的一个问题。 问&#xff1a;在python中使用pandas读取Excel数据&#xff0c;重复数据被区分了&#xff0c;如何做到重复数据不被区分&#xff1f; 解决思路 很明显&#xff0c;这是pandas读取excel文件时列名设置问题&#xff0c;我第一时间想…...

CMake常用语法

1. cmake_minimum_required(VERSION 3.4.1) 指定需要的最小的cmake版本 2. aux_source_directory 查找源文件并保存到相应的变量中: #查找当前目录下所有源文件并保存至SRC_LIST变量中 aux_source_directory(. SRC_LIST)3. add_library 3.1 添加一个库 add_library(<n…...

Java知识复习(一)基础知识

1、什么是JVM、JDK和JRE&#xff1f; JVM是指运行Java字节码的虚拟机。而字节码文件指的就是扩展名为.class的文件&#xff0c;JDK指功能齐全的Java SDK&#xff0c;能够创建和编译程序JRE指Java运行的环境&#xff0c;包括JVM、类库和命令等 2、重载和重写的主要区别 重载&…...

springboot+vue.js校园车辆用车预约管理系统

springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最火热的java开发框架 前端技术&#xff1a;nodejsvueelementui本项目的应用场景描述如下&…...

【 K8s 源码之调度学习】Pod 间亲和性和反亲和性的源码分析

查看案例 字段含义podAffinityPod 间的亲和性定义podAntiAffinityPod 间的反亲和性定义requiredDuringSchedulingIgnoredDuringExecution硬性要求&#xff0c;必须满足条件&#xff0c;保证分散部署的效果最好使用用此方式preferredDuringSchedulingIgnoredDuringExecution软性…...

计及绿证交易及碳排放的含智能楼宇微网优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

场景扩展,体验升级 | DBMotion新增无公网数据库迁移、支持监控报警等多项功能

丝滑的零停机数据库在线迁移工具——DBMotion&#xff0c;又双叒叕发新版&#xff1a;新增的网关、数据源功能&#xff0c;让你无公网IP的数据库也可以迁移&#xff1b;新增的监控功能&#xff0c;让你对迁移性能一目了然&#xff1b;新增的报警功能&#xff0c;让你及时获得同…...

【正点原子FPGA连载】第十五章eMMC读写测试实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十五章eMMC读写…...

i2c子系统

i2c 硬件协议 Linux 应用层读写i2c 数据 在Linux系统上&#xff0c;不仅可以在内核中使用 i2c 总线发送、接收数据&#xff0c;同时也支持应用层使用i2c 总线发送、接收。 如果在内核中使能了drivers/i2c/i2c-dev.c 配置&#xff0c;内核就会为每一个i2c 控制器生成一个/dev/…...

【K3s】第17篇 Helm版本和支持的Kubernetes版本对照表

目录 Helm版本和支持的Kubernetes版本对照表 Helm版本和支持的Kubernetes版本对照表 描述了在Helm和Kubernetes之间支持的最大版本偏差。 Helm的版本用 x.y.z 描述&#xff0c;x是主版本&#xff0c;y是次版本&#xff0c;z是补丁版本。 当一个Helm的新版本发布时&#xff0…...

如何自己搭建一个ai画图系统? 从0开始云服务器部署novelai

如何自己搭建一个ai画图系统&#xff1f; 从0开始云服务器部署novelai ​ 上面两张图都是通过ai生成的&#xff0c;是不是有以假乱真的感觉。 本教程提供的是自己搭建一个可以外网访问的ai系统的方法&#xff0c;需要采购gpu服务器&#xff08;后续会出白嫖的方式&#xff09;&…...

SpringSecurity过滤请求导致的系统bug

背景 今天开发一个新的会员管理系统&#xff0c;继承了SpringSecurity的&#xff0c;用以控制权限。结果无论怎么配置&#xff0c;都会报错&#xff1a;An Authentication object was not found in the SecurityContext 这句话的意思很明确&#xff1a;指的就是在SecurityCon…...

CUDA为什么能统治AI世界?NVIDIA真正可怕的并不是GPU

前言很多人第一次接触AI行业时&#xff0c;都会听到一个词&#xff1a;CUDA。而且你会发现一个非常奇怪的现象&#xff1a;很多AI框架、深度学习项目、GPU训练环境&#xff0c;几乎都默认要求&#xff1a;NVIDIA显卡CUDA环境甚至很多时候&#xff1a;没有CUDA&#xff0c;AI项目…...

Burp Suite安装失败原因与Java环境精准配置指南

1. 为什么Burp Suite的安装总让人卡在第一步&#xff1f;——从“打不开”到“能用”的真实断点 你是不是也经历过&#xff1a;下载完Burp Suite官方压缩包&#xff0c;双击 burpsuite_pro.jar 没反应&#xff1f;或者弹出一句“找不到Java环境”就戛然而止&#xff1f;又或…...

在昇腾NPU上写NumPy代码是种什么体验?asnumpy实战踩坑全记录

前言 最近项目需要在昇腾NPU上跑一些数值计算&#xff0c;不是训练模型&#xff0c;就是纯算东西——矩阵分解、特征值、随机采样之类的。一开始我想&#xff0c;NumPy代码直接跑不就行了&#xff1f; 不行。NumPy跑在CPU上&#xff0c;数据要从NPU搬回CPU才能算&#xff0c;…...

数据库锁机制:表锁、行锁(Oracle 默认)、共享锁、排他锁、乐观锁、悲观锁、死锁、Hive 中的锁

数据库锁机制是控制并发访问数据的关键技术。本文系统介绍了锁的概念、分类和应用场景&#xff1a;1&#xff09;锁通过限制并发访问确保数据一致性&#xff0c;类比厕所门锁机制&#xff1b;2&#xff09;按粒度分为表锁&#xff08;适合批量操作&#xff09;、行锁&#xff0…...

告别盲目复制粘贴:深度解析CW32固件库结构,让你的MDK工程更清晰

告别盲目复制粘贴&#xff1a;深度解析CW32固件库结构&#xff0c;让你的MDK工程更清晰 当你从官网下载CW32固件库压缩包并解压后&#xff0c;面对cw32f030-stdperiph-lib目录下密密麻麻的文件夹&#xff0c;是否感到无从下手&#xff1f;很多开发者习惯直接修改官方例程来开发…...

【MATLAB】红外图像增强与目标检测实现

【MATLAB】红外图像增强与目标检测实现 摘要:红外成像技术可全天候、无源感知目标热辐射信息,不受光照、雾霾、黑夜环境限制,广泛应用于安防监控、军事侦察、设备故障巡检、森林防火等领域。但受红外传感器噪声、大气衰减、环境杂波干扰影响,原始红外图像普遍存在对比度低…...

AI Daily Paper Reader(ADPR):零服务器搭建个人/团队通用大模型API驱动的论文阅读与推荐平台

一、背景 AI领域论文每日增长数量惊人&#xff0c;arXiv 上仅计算机科学相关的新论文每天就有上百篇。对于科研人员、研究生或AI从业者来说&#xff0c;如何高效筛选、阅读并跟踪与自己研究方向相关的论文&#xff0c;已成为日常工作中最耗时的一环。 传统的解决方案&#xf…...

深入理解 Java 反射机制(Reflection)

一句话先给答案反射 在程序运行时&#xff0c;动态获取类的信息并动态操作对象的能力。正常编程&#xff1a;类 → 对象 → 调用方法 反射&#xff1a;未知类 → 运行时拿到类结构 → 创建对象 / 调用方法 / 访问属性一、为什么需要反射&#xff1f;&#xff08;先解决动机&am…...

Mythos模型:通用AI在漏洞挖掘与 exploit 生成中的范式跃迁

1. 这不是一次普通升级&#xff1a;Mythos 的能力跃迁到底意味着什么“Claude Mythos Preview”——这个名字在2026年4月的AI圈里炸开时&#xff0c;我正调试一个用Opus 4.6做代码审计的自动化流水线。看到基准测试数据的第一反应不是兴奋&#xff0c;而是下意识关掉了终端窗口…...

MapReduce与Spark核心原理对比:从批处理到内存计算的演进

1. 从“批处理之王”到“内存计算引擎”&#xff1a;大数据处理范式的演进如果你刚接触大数据领域&#xff0c;可能会被Hadoop、MapReduce、Spark这些名词搞得晕头转向。它们听起来都像是处理海量数据的“重型武器”&#xff0c;但各自的设计哲学和适用场景却大相径庭。简单来说…...