树状数组——学习心得

news2024/10/10 22:39:50

可以解决大部分区间上面的修改以及查询的问题,例如1.单点修改,单点查询,2.区间修改,单点查询,3.区间查询,区间修改,换言之,线段树能解决的问题,树状数组大部分也可以,但是并不一定都能解决,因为线段树的扩展性比树状数组要强.

先简单了解一下树状数组的结构有个大致印像

树状数组很像前缀和结合树形结构的实现方式,对于t[x]来说是一种变异的前缀和,它所表示的是[x-len + 1, x]这个范围的和,而len就是上图左侧的标注的对应值。(len的代表的什么又怎么求下面会详细描述)

根据上面解释的t[x]的含义,想必善于观察的同学已经发现了t[x]在图中的特点,我们可以举个栗子来归纳一下

根据连线关系可以得到如下关系:

t[4] = t[2] + t[3] + a[4]

t[6] = t[5] + a[6]

t[8] = t[4] + t[6] + t[7] + a[8]

t[3] = a[3]

t[5] = a[5]

t[7] = a[7]

是不是规律有点呼之欲出的感觉,我们发现:

  • x为奇数时总等于a[x]

  • x为2的倍数时t[x]就为它的所有子节点(t[])加上a[x]的和。

所以我们想要快速求出t[x]就必须知道它有哪些子节点,这时候我们就需要引入一种特别的运算方法lowbit(x),我们就是通过lowbit来求len的值

lowbit(x)的描述如下:求的是x的二进制表示下的最低位的1和此位后的0组成的值,如x = 4(100)时得到的就是100(4);当x = 6(110)时得到的就是10(2);x = 7(111)时得到的就是1(1)

而求解方法也很简单就是x&-x(x按位与上取反后的x),假如x=4, 因为最低位1后面都是0,所以取反后最低位1会变0,后面的0都会变1(0100 --> 1011 ),然后再+1就得到了-x(1100),接下来按位与:

    0100

& 1100

= 0100

就得到最后我们要的值。(不明白的可以先看看负数的二进制表示和按位与运算)

最后我们知道 len = lowbit(x){return x&-x;}

对于sum[7] = t[4] + t[6] + t[7],而我们发现7-lowbit(7)=6,6-lowbit(6)=4,4-lowbit(4)=0,用x-lowbit(x)就能找到下一个需要的区间,同理x+lowbit(x)就能找到父节点。

到这里我们就可以总结一下t[x]的求法了

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

//求和
int getSum(int x) {//往前找
	int sum = 0;
	for(int i = x; i > 0; i -= lowbit(i)){
		sum += t[i];
	}
	return sum;
}

//更新t[]
void update(int x, int val) {//往后找,找父节点
	for(int i = x; i<= bound ; i += lowbit(i)) {
		t[i] += val;
	}
}

void init() {
    int a[] = {0,2,3,4,1,6,4,7,8};//从下标为1开始
    for(int i = 1; i < a.length; i++) {
        update(i, x);
    }
}



//1.单点修改,单点查询
int main() {
	init();
    //单点修改
    update(x,y);//下标为x的值改变y;
    //单点查询  
    getSum(k);
}

//2.区间修改,单点查询
int main() {
	init();
    //区间修改  [m,n]改变y
    for(int i = m; i <= n; i++) {
        update(i, y);
    }
    //单点查询  
    getSum(k);
}

//3.区间查询,区间修改
自己动手尝试一下吧

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2203369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全栈开发笔记

1.后端没问题 前端不显示返回数据&#xff1f; 返回数据被&#xff0c;axios拦截器拦截了 2.路径跳转显示空白&#xff1f; 没有配置router 3.后端部署到服务器上 无法通过外网访问接口&#xff1f; 检查服务器防火墙设置 即使服务监听正确&#xff0c;服务器本身的防火墙也可能…

【工作流引擎集成】springboot+Vue+activiti+mysql带工作流集成系统,直接用于业务开发,流程设计,工作流审批,会签

前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;一套完整并且实际运用在多套项目中的案例&#xff0c;满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;流行的前后端…

前端_002_CSS扫盲

文章目录 概念选择器常用属性背景边框高度和宽度颜色文本字体链接表格里对齐显示相关溢出&#xff0c;滚动条属性 伪类和伪元素 概念 1.书写格式&#xff1a; 选择器{ 属性名:属性值 ; 属性名:属性值 ; } 2.文件后缀.css 选择器 元素选择器 [tag] id选择器 #[id_name] c…

西门子S7-SMART运动控制向导

打开“运动控制”向导&#xff0c;“工具”->“向导”->“运动控制” 图 1.打开“运动控制”向导 选择需要配置的轴 图 2.选择需要配置的轴 为所选择的轴命名 图 3.为所选择的轴命名 输入系统的测量系统&#xff08;“工程量”或者“脉冲数/转”&#xff…

开机启动项在哪里关闭?五个全面指南,教你关闭开机启动项!(新)

您是否发现您的电脑运行性能正在受一些无关紧要的应用程序所影响呢&#xff1f;也许您没有意识到&#xff0c;每当您登录电脑时&#xff0c;许多程序会在不知情的情况下自动启动。这些自动启动的程序不仅会拖慢系统的运行速度&#xff0c;还会占用大量的内存和cpu资源。为了改善…

QT:绘制事件和定时器

1.绘制时针 xx.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include<QPainter> #include <QTime>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpubl…

YOLOv11进行图像与视频的目标检测

一、AI应用系统实战项目 项目名称项目名称1.人脸识别与管理系统2.车牌识别与管理系统3.手势识别系统4.人脸面部活体检测系统5.YOLOv8自动标注6.人脸表情识别系统7.行人跌倒检测系统8.PCB板缺陷检测系统9.安全帽检测系统10.生活垃圾分类检测11.火焰烟雾检测系统12.路面坑洞检测…

使用Qt Creator创建项目

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 使用Qt Creator创建项目 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 温馨提示: 1. 新…

Fastjson反序列化

Fastjson反序列化一共有三条利用链 TempLatesImpl&#xff1a;实战中不适用JdbcRowSetImpl&#xff1a;实际运用中较为广泛BasicDataSource&#xff08;BCEL&#xff09; 反序列化核心 反序列化是通过字符串或字节流&#xff0c;利用Java的反射机制重构一个对象。主要有两种…

Spring Boot 进阶-详解Spring Boot与其他框架整合

通过前面的文章,我们了解到了Spring、Spring Boot框架都是为Java企业级开发提供了一个基础框架,我们可以通过这个基础框架去整合其他的框架来实现我们具体的业务功能。 在网站上搜索一下,Spring Boot整合某某框架就会出现大量的教程,但是总会有一天你会遇到一个你没有教程的…

jenkins中的allure和email问题梳理

一、allure相关 1、我安装了jenkins之后需要再安装allure吗&#xff1f;在jenkins插件中心直接安装allure 1.Allure Jenkins Plugin 只是一个集成插件&#xff0c;它要求你在 Jenkins 服务器上安装 Allure 命令行工具&#xff08;Allure Commandline&#xff09;来实际生成报…

真的有被Transformer多头注意力惊艳到…

在这篇文章中&#xff0c;我们将深入探讨 Transformer 的核心部分-多头注意力&#xff08;Multi-head Attention&#xff09;。 这个机制能让 Transformer 同时从多个角度理解数据&#xff0c;提高处理信息的能力和效率。 01、Transformer 中如何使用注意力机制 Transformer…

[数据结构]带头双向循环链表的实现与应用

文章目录 一、引言二、链表的基本概念1、链表是什么2、链表与顺序表的区别3、带头双向循环链表 三、带头双向循环链表的实现1、结构体定义2、初始化3、销毁4、显示5、增删查改 四、分析带头双向循环链表1、存储方式2、优点3、缺点 五、总结1、练习题2、源代码 一、引言 链表作…

修复PDF打印速度慢

详细问题&#xff1a; 当您尝试将 PDF 文件打印到本地或网络打印机时&#xff0c;打印需要很长时间&#xff0c;因为发送打印作业后&#xff0c;打印机开始打印的速度非常慢&#xff0c;在打印任务中可以看到打印传输的数据在缓慢增长。 从其他程序打印时也不会出现打印速度慢…

c++的web框架Restbed介绍及在嵌入式Linux下的移植详解

随着物联网和嵌入式设备的普及&#xff0c;开发高性能的网络服务变得愈发重要。Restbed是一个用于构建RESTful APIs的轻量级C框架&#xff0c;因其简洁而强大的特性&#xff0c;成为开发者的热门选择。本文将介绍Restbed框架及其在嵌入式Linux平台上的移植方法。 一、Restbed框…

东方博宜 1176. 素数问题

东方博宜 1176. 素数问题 #include<iostream> using namespace std; int main() { int n ;while(cin >> n && n!0) {int count_n ;count_n 0 ;int k ;for( k 1 ; k < n ; k){int count_k ;count_k 0 ;int j ;for( j 2 ; j < k ; j){if (k % j …

基于SSM的大学生勤工助学管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的大学生勤工助学管理系统1拥有三种角色&#xff1a;管理员、学生和用工部门&#xff0c;具体功能如下 1.1 背景描述 基于SSM框架&#xff08;SpringSpring MVCMyBatis&#xff09…

Java微信支付接入(1) - API V3 引入支付参数

1.定义微信支付相关参数 wxpay.properties 文件 这个文件定义了之前我们准备的微信支付相关的参数&#xff0c;例如商户号、APPID、API秘钥等等 # 微信支付相关参数 # 商户号 wxpay.mch-id1558950191 # 商户API证书序列号 wxpay.mch-serial-no34345964330B66427E0D3D28826C49…

HTB:Base[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which two TCP ports are open on the remote host? 2.What is the relative path on the webserver for the login page? 3.How many files are present in the /login directory? 4.What is the file extension of a swap file? …

DeepACO:用于组合优化的神经增强蚂蚁系统解决TSP问题的代码阅读

总体概括 DeepACO与普通ACO不同的是将问题输入实例输入到一个训练的网络中&#xff0c;将网络训练成为一个类似于专家知识的模块&#xff0c;可以生成相应的启发式矩阵网络&#xff0c;从而省去相应的专家知识。 其中在训练网络的代码中&#xff1a; 是进行监督式训练通过trai…