代码编织梦想

树状数组是个好东东,我们一定要学会。

单点修改需O(n),树状数组只需O(log_n)

区间查询需O(n),树状数组只需O(log_n)

区间修改与查询,用它!用它!用它!!!

树状数组基本概念

树状数组的核心思想有关于二进制,不算特别难,而且代码贼短,适合作者这种小菜。

树状数组就是让需要改变的那个区间的第一个数加上改变的大小;让区间最后一个数的后一个数减去要改变的大小(类似差分)。第一个数加完后,使包含它的数也加上改变的大小;最后一个数的后一个数减完后,使包含它的数也减上改变的大小

好,讲完这么多,你们肯定不理解,接下来我来解释(说了一堆废话

树状数组单点修改

进入正题。

区间修改我们普通修改是不是需要O(n),但是我们用树状数组只需要O(log_n),是不是很优呢?

当我们修改第一个数的时候,让他增加一个数n(我们假定n为2)。但在个时候,有一些本来包含这个数的大数就不服了:“我们包含他,他咋还比我们大了呢?”,所以说这个时候,为了平复民情啊,我们还需要把包含这个数的大数也加上2,附上一张图:

看,比如说我们要更改的是3的话,那包含他的数是不是有:4,8,16。所以说我们需要让这些数也加上2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dldlzjfs/article/details/126260622

搞懂树状数组_alxbaj的博客-爱代码爱编程

搞懂树状数组 2012年04月05日 22:15:40 阅读数:51443   出处:http://blog.csdn.net/int64ago/article/details/7429868       写下这个标题,其实心里还是没底的,与其说是写博帖,不如说是做总结。第一个接触树状数组还是两年前,用什么语言来形容当时的感觉呢?……太神奇了!真

树状数组详细讲解,不会算法也能看懂哦-爱代码爱编程

有一天,小明给了我三个问题(其实是我自己出的啦~) (1)有一个机器,支持两种操作,在区间[1,10000]上进行。 操作A:把位置x的值+k 操作B:询问区间[l,r]所有数字之和 区间的初始值全部为0 现在你要充当这个机器,操作A和操作B会被穿插着安排给你, 要求对于所有操作B,给出正确的答案。 怎样做才能最节省精力? (2)有一个机器

树状数组——求逆序对个数(初学者都能看懂)-爱代码爱编程

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

树状数组 java_树状数组详解-爱代码爱编程

先来看几个问题吧。 1.什么是树状数组? 顾名思义,就是用数组来模拟树形结构呗。那么衍生出一个问题,为什么不直接建树?答案是没必要,因为树状数组能处理的问题就没必要建树。和Trie树的构造方式有类似之处。 2.树状数组可以解决什么问题 可以解决大部分基于区间上的更新以及求和问题。 3.树状数组和线段树的区别在哪里 树状数组可以解决的问题都可

怎么在java中实现树状数组_Java基础 - 树状数组Java版-爱代码爱编程

下面的文字说明引用了 int64Ago 的一篇博文。 用什么语言来形容当时的感觉呢?……太神奇了!真的,无法表达出那种感觉,她是那么的优雅,10行不到的代码,却把事情干的如此出色!没有了解她原理的前提下即使把代码倒背如流也理解不了!下面我争取用自己的方式让更多人明白她,而不是背诵她。为了更方便的说明,文章里会自己强加一些概念,只是为了更好的理解,不是

树状数组(详细分析+应用),看不懂打死我!-爱代码爱编程

树状数组介绍 在学习一个算法之前一定要清楚它能干嘛,能解决什么样的问题,对你解题是否有帮助,然后才去学习它! 那么接下来看如下几个问题 什么是树状数组 顾名思义就是一个结构为树形结构的数组,于二叉树的结构类似但又不同,它是在二叉树的结构上删除了一些中间节点,来看两幅图就明白了. 1.这是二叉树的结构 2.这是树状数组的结构 不难发现,树状数组相比

树状数组讲解(简洁好懂)-爱代码爱编程

树状数组 树状数组是用于维护前缀和的数据结构,支持单点的查询和修改,如果要修改区间的值则需要用到差分数组。数字太大时可以在排序后进行离散化。 树状数组原理详解: 首先我们需要知道lowbit(x)是返回x的最后一个1,例如二进制数10100就返回100. 树状数组的核心思想是将一个数分解成若干零件,在维护的时候,直接对这些零件进行处理,在查询的时候

什么是树状数组-爱代码爱编程

        首先我们搞明白树状数组是用来干嘛的,现在有一个这样的问题:有一个数组a,下标从0到n-1,现在给你w次修改,q次查询,修改的话是修改数组中某一个元素的值;查询的话是查询数组中任意一个区间 [left,right] 的和。         这个问题很常见 首先分析下朴素做法的时间复杂度,修改是O (1) 的时间复杂度,而查询的话是O(n)

树状数组(详细入门介绍)(看不懂你打我)-爱代码爱编程

如图所示, 1-9表示树状数组的9个元素,每个元素序号都用二进制表示。 每个元素中存放的并不都是一个值,而是根据序号的末尾0的个数,存放2^末尾0的个数 个值。 如4号元素,4对应二进制为100,末尾有两个0,所以存放2^2=4个值,即C4=A1+A2+A3+A4. 求前缀和 如求7这个位置的前缀和,7对应的二进制为111。 将7对应的

数据结构 模拟实现arraylist顺序表-爱代码爱编程

目录 一、顺序表中的接口 二、顺序表中的方法实现 (1)display方法 (2)add方法 1、不指定下标位置插入 2、指定下标位置插入 (3)contains方法 (4)indexOf方法 (5)get方法 (6)set方法 (7)remove方法 (8)size方法 (9)clear方法 三、最终代码 一、顺序表

数据结构:lru cache-爱代码爱编程

文章目录 什么是LRU CacheLRU Cache的实现LRU缓存 什么是LRU Cache LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。

03-爱代码爱编程

1.栈 栈和队列是两种操作受限的线性表。如上图所示显示栈的结构 栈:先进后出,入栈(数据进入) 和出栈(数据出去)均在栈顶操作。 常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现 1.1 栈的代码实现 #include<iostream> #include<stdio.h> #includ

【数据结构】并查集的简单实现,合并,查找(c++)-爱代码爱编程

文章目录 前言举例: 一、1.构造函数2.查找元素属于哪个集合FindRoot3.将两个集合归并成一个集合Union4.查找集合数量SetCount5.是否在同一个集合中 二、源码 前