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

树状数组

树状数组

树状数组的核心思想:分治。将数组以二叉树的形式进行维护区间之和。

a a a为原数组, t r e e tree tree为树状数组。 t r e e tree tree数组用于存储树上该结点下严格直连的子节点之和(例: t [ 1 ] = a [ 1 ] , t [ 2 ] = t [ 1 ] + a [ 2 ] , t [ 3 ] = a [ 3 ] , t [ 4 ] = t [ 2 ] + t [ 3 ] + a [ 4 ] t[1]=a[1],t[2]=t[1]+a[2],t[3]=a[3],t[4]=t[2]+t[3]+a[4] t[1]=a[1],t[2]=t[1]+a[2],t[3]=a[3],t[4]=t[2]+t[3]+a[4] t [ 5 ] = a [ 5 ] , t [ 6 ] = t [ 5 ] + a [ 6 ] , t [ 7 ] = a [ 7 ] , t [ 8 ] = t [ 4 ] + t [ 6 ] + t [ 7 ] + a [ 8 ] , t[5]=a[5],t[6]=t[5]+a[6],t[7]=a[7],t[8]=t[4]+t[6]+t[7]+a[8], t[5]=a[5],t[6]=t[5]+a[6],t[7]=a[7],t[8]=t[4]+t[6]+t[7]+a[8],…),即存储 [ x − l o w b i t ( x ) + 1 , x ] [x-lowbit(x)+1,x] [xlowbit(x)+1,x]区间之和

树状数组的操作:向下查询 向上修改

向下查询:查询前一个能代表其和的元素(例: s u m ( 4 ) = t [ 4 ] , s u m ( 3 ) = t [ 3 ] + t [ 2 ] , s u m ( 2 ) = t [ 2 ] , … sum(4)=t[4],sum(3)=t[3]+t[2],sum(2)=t[2],… sum(4)=t[4],sum(3)=t[3]+t[2],sum(2)=t[2],),可发现与下标的二进制表示有关,每次下标更新都在去掉二进制位中的最低的1,这一操作可用 i n d e x − = l o w b i t index-=lowbit index=lowbit实现。

向上修改:向后更新到其所有的代表结点(例:修改 a [ 3 ] a[3] a[3],需要修改 t [ 3 ] 、 t [ 4 ] 、 t [ 8 ] t[3]、t[4]、t[8] t[3]t[4]t[8]),可以发现每次更新是在下标二进制中最后一个1上+1,因此可通过 i n d e x + = l o w b i t index+=lowbit index+=lowbit实现。

注意:0没有 l o w b i t lowbit lowbit,因此树状数组下标必须从1开始。

树状数组

lowbit函数的实现

int lowbit(int i){return i&(-i);
}

修改函数的实现(向上修改)

void update(int i,int num){//向上修改for(;i<=N;i+=lowbit(i))tree[i]+=num;
}

查询函数的实现(向下查询)

int query(int i){//向下查询int ans=0;for(;i>=1;i-=lowbit(i))//注意tree数组下标从1开始ans+=tree[i];return ans;
}

单点修改 区间查询(前缀和版树状数组)

  • 初始化
void init(){//初始化tree数组for(int i=1;i<=n;i++)//注意tree数组下标从1开始update(i,a[i]);//在初始化tree数组时num所传入参数为原数组值 
}
  • 单点修改(以将 x x x n u m num num为例)
extern int x,num;
update(x,num);
  • 区间查询(以查询 [ l , r ] [l,r] [l,r]为例)
extern int l,r;
query(r)-query(l-1);

区间修改 单点查询(差分版树状数组)

  • 初始化
void init(){for(int i=1;i<=n;i++)update(i,a[i]-a[i-1]);//num传入差分数组
}
  • 区间修改(以 [ l , r ] [l,r] [l,r]均加 n u m num num为例)
extern int l,r,num;
update(l,num),update(r+1,-num);
  • 单点查询(以查询 x x x为例)
extern int x;
query(x);

区间修改+区间查询(二阶树状数组)

(注:此类问题也可采用线段树求解。)

a 1 + a 2 + . . . + a n = d 1 + ( d 1 + d 2 ) + . . . + ( d 1 + . . . + d n ) = n × d 1 + ( n − 1 ) × d 2 + . . . + d n a_1+a_2+...+a_n=d_1+(d_1+d_2)+...+(d_1+...+d_n)=n\times d_1+(n-1)\times d_2+...+d_n a1+a2+...+an=d1+(d1+d2)+...+(d1+...+dn)=n×d1+(n1)×d2+...+dn

= n ∑ i = 1 n d i − ∑ i = 1 n ( i − 1 ) d i =n\sum\limits_{i=1}^{n} d_i-\sum\limits_{i=1}^{n}(i-1)d_i =ni=1ndii=1n(i1)di(核心公式)

因此,维护两个树状数组,一个用于实现 d i d_i di,另一个实现 ( i − 1 ) d i (i-1)d_i (i1)di

  • 查询函数、修改函数变更为:
void update1(int i,int num){for(;i<=n;i+=lowbit(i))t1[i]+=num;
}
void update2(int i,int num){for(;i<=n;i+=lowbit(i))t2[i]+=num;
}
int query1(int i){int ans=0;for(;i>=1;i-=lowbit(i))ans+=t1[i];return ans;
}
int query2(int i){int ans=0;for(;i>=1;i-=lowbit(i))ans+=t2[i];return ans;
}
  • 初始化函数(按照推导公式)
void init(){for(int i=1;i<=n;i++){update1(i,a[i]-a[i-1]);//对tree1传入差分数组update2(i,(i-1)*(a[i]-a[i-1]));//对tree2传入(i-1)*差分数组}
}
  • 区间修改(以 [ l , r ] [l,r] [l,r]均加 n u m num num为例)
extern int l,r,num;
update1(l,num),update1(r+1,-num);//对tree1加上差值
update2(l,(l-1)*num),update2(r+1,(r+1-1)*(-num));//对tree2加上差值(根据推导公式)
  • 区间查询(以查询 [ l , r ] [l,r] [l,r]为例)(本质:在求前缀和)
extern int l,r;
(r*query1(r)-query2(r))-((l-1)*query1(l-1)-query2(l-1));

应用

求区间之和

以上已给出。

求区间最值

求逆序数

相关文章:

树状数组

树状数组 树状数组的核心思想&#xff1a;分治。将数组以二叉树的形式进行维护区间之和。 设 a a a为原数组&#xff0c; t r e e tree tree为树状数组。 t r e e tree tree数组用于存储树上该结点下严格直连的子节点之和(例&#xff1a; t [ 1 ] a [ 1 ] , t [ 2 ] t [ 1 …...

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...

ansible常见问题配置好了密码还是报错

| FAILED! > { “msg”: “Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host’s fingerprint to your known_hosts file to manage this host.” } 怎么解决&#xf…...

python-课程满意度计算(赛氪OJ)

[题目描述] 某个班主任对学生们学习的的课程做了一个满意度调查&#xff0c;一共在班级内抽取了 N 个同学&#xff0c;对本学期的 M 种课程进行满意度调查。他想知道&#xff0c;有多少门课是被所有调查到的同学都喜欢的。输入格式&#xff1a; 第一行输入两个整数 N , M 。 接…...

6、Redis系统-数据结构-05-整数

五、整数集合&#xff08;Intset&#xff09; 整数集合是 Redis 中 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素&#xff0c;并且元素数量不大时&#xff0c;就会使用整数集合这个数据结构作为底层实现。整数集合通过紧凑的内存布局和升级机制&#xff0c;实现了…...

STM32学习历程(day5)

EXTI外部中断 中断 中断就是在主程序运行过程中 出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;CPU会暂停当前的程序&#xff0c;去处理中断程序 处理完会返回被暂停的位置 继续运行原来的程序。 中断优先级 当有多个中断源同时申请中断时 CPU会根据…...

格蠹汇编阅读理解

一、调试工具使用方式 WinDbg常用命令&#xff1a; 执行 lm 命令&#xff0c;可以看到进程中有几个模块。执行~命令列一下线程。用!heap 命令列一下堆。执行!address 命令可以列出用户态空间中的所有区域。搜索吧&#xff01;就从当前进程用户态空间的较低地址开始搜&#xf…...

深入探索:scikit-learn中递归特征消除(RFE)的奥秘

深入探索&#xff1a;scikit-learn中递归特征消除(RFE)的奥秘 在机器学习的世界里&#xff0c;特征选择是一项至关重要的任务。它不仅能够提高模型的性能&#xff0c;还能减少模型的复杂度&#xff0c;避免过拟合。scikit-learn&#xff0c;作为Python中一个广泛使用的机器学习…...

240708_昇思学习打卡-Day20-MindNLP ChatGLM-6B StreamChat

240708_昇思学习打卡-Day20-MindNLP ChatGLM-6B StreamChat 基于MindNLP和ChatGLM-6B实现一个聊天应用&#xff0c;本文进行简单记录。 环境配置 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mi…...

lua入门(2) - 数据类型

前言 本文参考自: Lua 数据类型 | 菜鸟教程 (runoob.com) 希望详细了解的小伙伴还请查看上方链接: 八个基本类型 type - 函数查看数据类型: 测试程序: print(type("Hello world")) --> string print(type(10.4*3)) --> number print(t…...

dify/api/models/provider.py文件中的数据表

源码位置&#xff1a;dify/api/models/provider.py providers 表结构 字段英文名数据类型字段中文名字备注idStringUUIDIDtenant_idStringUUID租户IDprovider_nameString提供商名称provider_typeString提供商类型encrypted_configText加密配置is_validBoolean是否有效last_us…...

从入门到精通:网络基础详解

前言 在现代社会&#xff0c;网络技术已经成为我们日常生活和工作中不可或缺的一部分。从简单的网页浏览到复杂的分布式系统&#xff0c;网络技术都扮演着至关重要的角色。通过这篇文章&#xff0c;读者将从入门到精通&#xff0c;全面掌握网络编程的理论和实践。 重点摘要 …...

初步理解三__《面向互联网大数据的威胁情报 并行挖掘技术研究》

初步理解三 5类战术标签 gtp 收集开源的网络安全报告并将其转化为统一的文本格式&#xff0c;并且标注了5类战术标签是一个涉及到数据处理和分类的复杂任务。以下是一种可能的处理方法&#xff1a; 数据收集和整合&#xff1a; 使用网络爬虫或API访问工具收集开源的网络安全…...

【C++修行之道】string类的使用

目录 一.C语言中的字符串 二、标准库中的string类 (了解) 2.1 string类(了解) 2.2 帮助文档阅读 三、 string类的常用接口说明 3.1 string类对象的常见构造 3.2 string类对象的容量操作 3.3 string类对象的访问及遍历操作 字符串类的简单实现 3.4 string类对象的修改…...

云原生监控-Kubernetes-Promethues-Grafana

云原生监控-Prometheus 作者:行癫(盗版必究) 引读:本文章所涉及到技术点包括Prometheus、Grafana、Kuebrnetes;Prometheus基于外部构建采集并监控Kubernetes集群以及集群中的应用,例如使用mysql-node-exporter、nginx-node-exporter采集Kuebrnetes集群中的应用数据,使用…...

MySQL高级----InnoDB引擎

逻辑存储结构 表空间 表空间(ibd文件)&#xff0c;一个mysql实例可以对应多个表空间&#xff0c;用于存储记录、索引等数据。 段 段&#xff0c;分为数据段&#xff08;Leaf node segment)、索引段(Non-leaf node segment)、回滚段(Rollback segment)&#xff0c;InnoDB是…...

Docker定时清理

一、循环调度执行 1、检查cron状态 systemctl status crond 2、创建要执行的shell脚本 vim /home/cleanup_docker.sh #! /bin/bash # 清理临时文件 echo $(date "%H:%M:%S") "执行docker清理命令..." docker system prune -af-a 清理包括未使用的镜像 …...

mysql之导入测试数据

运维时经常要这样&#xff1a;mysql改表名&#xff0c;创建一个一样的表不含数据&#xff0c;复制旧表几条数据进去 改变表的名字&#xff1a; RENAME TABLE old_table_name TO new_table_name; 这将把原来的表old_table_name重命名为new_table_name。 创建一个一样的表结构…...

WPScan漏洞扫描工具的介绍及使用

目录 1. 介绍2. 常用参数 1. 介绍 WPScan是Kali Linux默认自带的一款漏洞扫描工具&#xff0c;它采用Ruby编写&#xff0c;能够扫描WordPress网站中的多种安全漏洞&#xff0c;其中包括WordPress本身的漏洞、插件漏洞和主题漏洞&#xff0c;最新版本WPScan的数据库中包含超过18…...

基于单片机的饲料搅拌机控制系统设计

摘要 &#xff1a; 文章主要从软件和硬件两个部分对基于单片机的饲料搅拌机控制系统进行研究设计 。 硬件部分主要由传感器模块 、 信号采集模块、 键盘接入模块 、 LED 显示模块 、 继电器模块以及看门狗模块组成 。 软件部分在 KeilC51 软件基础上重点对控制系统主程序 、…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...