树状数组入门篇2

树状数组的高效性主要就是通过将一条线段分成若干个小线段(其中每个小线段存储着2^k大小的区间和,这就将区间和问题复杂度降到了logn),而不是一个一个单一的点

add()操作修改了单点的值,同时对之后的父亲节点进行了更新(之所以只更新该点以及该点的父亲节点而不更新该点的非父亲节点,是因为求和时父亲节点直接包含该点所以会跳过该点,也就不能接受该点,所以就需要自身更新,而非父亲节点在求和时会直接加上该点,所以就不需要进行更新)

正是由于add()操作对父亲节点以及非父亲节点的区别才使每次的sum()操作求到的就是更新之后的正确值

也正是由于树状数组的add()通过对单点的修改就能对该点之后的区间和进行修改,所以树状数组不仅可以解决简单的单点修改与区间和查询,还能进行区间点修改与单点查询

其中进行单点修改时的add()修改单点,sum()查询区间和,而进行区间点修改时,add()修改区间点的变动次数,sum()查询单点的变动次数

杭电oj1556http://acm.hdu.edu.cn/showproblem.php?pid=1556

原文地址:https://www.cnblogs.com/MekakuCityActor/p/8507298.html

时间: 2024-10-08 18:43:51

树状数组入门篇2的相关文章

树状数组入门

用office做了一张pdf - - 这是一维的情形,如果是二维,可以把每一行的一维树状数组看成一个节点,然后再把二维树状数组看成一维树状数组. 好文章:https://www.topcoder.com/community/data-science/data-science-tutorials/binary-indexed-trees/#prob 两道入门题:http://acm.hdu.edu.cn/showproblem.php?pid=1556 http://poj.org/problem

HDU 1166 敌兵布阵【树状数组入门题】

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 74051    Accepted Submission(s): 31080 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

树状数组 小白篇(2)暨区间修改

这篇主要来讲一讲树状数组的区间修改 因为一个一个点改,毫无疑问耗时太长 所以,机智的人类YY出了用差分来表示数组 为了便于理解,简单一点数组{an}:a[1]=0, a[2]=0, a[3]=0, a[4]=0, a[5]=0, a[6]=0 ,a[7]=0, a[8]=0, a[9]=0 用差分思想,delta[x]表示a[x]-a[x-1] 显然,一开始delta[]=0 我们先计算出前n项和{sn}来 然后别眨眼,下面就是见证奇迹的时刻! 有个分界线显得正式一点 我们要把a[3]到a[6]

Binary Indexted Tree 树状数组入门

感谢http://www.cnblogs.com/xudong-bupt/p/3484080.html 树状数组(BIT)是能够完成下述操作的数据结构: 给定一初始值全为零的数列a1,a2a,a3...,an 1.给定i,计算a1+a2+...+ai 2.给定i和x,执行ai+=x BIT的结构: 数组bit[N] bit[1]=C1=A1;bit[2]=C2=C1+A2; BIT就是使用数组来维护上面所说的部分和 以1结尾的1,3,5,7长度为1 以1个0结尾的2,6长度为2 以两个0结尾的4

HDU 1166 敌兵布阵 (树状数组入门)

树状数组的引入: 对于查询和修改要求差不多,使用树状数组可以达到logN的复杂度 红色矩形表示的数组C就是树状数组.这里,C[i]表示A[i-2^k+1]到A[i]的和,而k则是i在二进制时末尾0的个数,或者说是i用2的幂方和表示时的最小指数. 所谓的k,也是该节点在树中的高度. 修改第i个元素,为了维护数组C的意义,需要修改C[i]以及C[i]的全部祖先,而非C[i]的祖先的节点则对于第i个元素的修改,不会发生改变.祖先共有"树的高度 - C[i]节点高度"个 要求区间[p,q]元素

poj2299 树状数组入门题

题意:利用树状数组求逆序数: 思路:因为输入范围较大,先离散化一下,得到的数组a记录了原来数组的大小关系:然后按下标顺序执行add(a[i],1),这样sum(a[i])得到的就是小于等于a[i]的个数,i-sum(a[i])即为a[i]前面比a[i]大的数的个数 //外循环n次并累加i-sum(a[i])得到逆序数 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<alg

树状数组 小白篇(1)

身为一名弱省oier中的mengbier,简单讲一下我是怎么学会基础的树状数组的 不算华丽的分割线 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构. 其发明者命名为Fenwick树,最早由Peter M. Fenwick于1994年以<A New Data Structure for Cumulative Frequency Tables>为题发表在 "SOFTWARE PRACTICE A

HDU-1166 敌兵布阵 (线段树&amp;&amp;树状数组入门)

敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:"Tid

二维树状数组入门题 poj2642Stars

题目连接:Stars 题解:把一维的的树状数组扩展到二维就行,复杂度为o(mlog^2n) #include<bits/stdc++.h> #include<set> #include<cstdio> #include<iomanip> #include<iostream> #include<string> #include<cstring> #include<algorithm> #define pb pus