说到树状数组,线段树就是一样逃不开的东西,在这里附上线段树的博客链接【令人头秃的线段树】线段树入门题目详解(代码逐句分析)
线段树在处理动态求区间和的功能上可以说已经比较完美了,但是线段树的代码其实是比较繁琐的,稍有不慎就会翻车。尤其是在比赛时的高压环境,繁琐的代码其实是需要尽量去避免的。因此,树状数组的优势就体现出来了----代码在实现上相当方便。但是当然,凡事都是有代价的,树状数组的理解相当痛苦,基本上是属于知其然却不知其所以然的地步。

情景引入 Acwing动态求连续区间和

1264. 动态求连续区间和给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和。输入格式
第一行包含两个整数 n 和 m,分别表示数的个数和操作次数。第二行包含 n 个整数,表示完整数列。接下来 m 行,每行包含三个整数 k,a,b (k=0,表示求子数列[a,b]的和;k=1,表示第 a 个数加 b)。数列从 1 开始计数。输出格式
输出若干行数字,表示 k=0 时,对应的子数列 [a,b] 的连续和。数据范围
1≤n≤100000,
1≤m≤100000,
1≤a≤b≤n
输入样例:
10 5
1 2 3 4 5 6 7 8 9 10
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8
输出样例:
11
30
35

在线段树的博客中,我们详细的讲解了线段树的解法,在这里,我们试着用树状数组来解决这个问题。

#include<iostream>
#include<iomanip>
#include <utility>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<set>
#include<bitset>
#include<ctime>
#include<cstring>
#include<list>
#define ll long long
#define fi first
#define se second
using namespace std;
typedef  pair<int, int> PII;
const int N = 5e5 + 10;
int n, m;
int tr[N];int lowbit(int x)//板子函数
{return x & (-x);
}void add(int x, int v)//实现第x个数加v
{for (int i = x; i < N; i += lowbit(i))tr[i] += v;
}int query(int x)//询问1-x的和
{int res = 0;for (int i = x; i > 0; i -= lowbit(i))res += tr[i];return res;
}
void solve()
{cin >> n >> m;for (int i = 1; i <= n; i++){int t;cin >> t;add(i, t);}for (int i = 1; i <= m; i++){int k, a, b;cin >> k >> a >> b;if (k == 2){cout << query(b) - query(a - 1) << endl;}else{add(a, b);}}
}int main()
{solve();return 0;
}

在这里,原数组的存在是已经被忽略掉了,add函数的作用就是实现数组里第x个数加上v,而query函数的作用就是返回数组中第一个数到第x个数的总和lowbit函数则是实现树状数组的一个必要的函数,相信在其它大佬的博客里会有一个大家能够听懂的解释(对不起,笔者太菜了 )

作者:Avalon Demerzel,喜欢我的博客就点个赞吧,更多图论与数据结构知识点请见作者专栏《图论与数据结构》

【数据结构】树状数组效果讲解相关推荐

  1. js 数组 实现 完全树_算法和数据结构 | 树状数组(Binary Indexed Tree)

    本文来源于力扣圈子,作者:胡小旭.点击查看原文 力扣​leetcode-cn.com 树状数组或二叉索引树(英语:Binary Indexed Tree),又以其发明者命名为 Fenwick 树.其初 ...

  2. 数据结构——树状数组

    我们今天来讲一个应用比较广泛的数据结构--树状数组 它可以在O(nlogn)的复杂度下进行单点修改区间查询,下面我会分成三个模块对树状数组进行详细的解说,分别是树状数组基本操作.树状数组区间修改单点查 ...

  3. 数据结构--树状数组

    文章目录 1. 树状数组 2. 单点修改 3. 区间修改 4. 完整代码 5. 参考文献 1. 树状数组 类似数据结构:线段树(Segment Tree) 树状数组 跟 线段树 的区别: 树状数组能做 ...

  4. 2017西安交大ACM小学期数据结构 [树状数组 离散化]

    Problem E 发布时间: 2017年6月28日 12:53   最后更新: 2017年6月29日 21:35   时间限制: 1000ms   内存限制: 64M 描述 给定一个长度为n的序列a ...

  5. 2017西安交大ACM小学期数据结构 [树状数组,极大值]

    Problem D 发布时间: 2017年6月28日 10:51   最后更新: 2017年6月28日 16:38   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为n的序列a ...

  6. 2017西安交大ACM小学期数据结构 [树状数组]

    Problem C 发布时间: 2017年6月28日 11:38   最后更新: 2017年6月28日 16:38   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为n的序列a ...

  7. 数据结构 —— 树状数组

    [概述] 树状数组又称二叉索引树,常用于高效计算数列的前缀和.区间和,其查询.修改的时间复杂度为 log(n),空间复杂度为 O(n) 树状数组通过将线性结构转化成树状结构,从而进行跳跃式扫描. 优点 ...

  8. Java数据结构-树状数组

    什么是树状数组?[面试5.0] 使用数组表示多叉树的结构,和优先队列有点类似,区别在于优先队列只表示二叉树 主要用来: 更新数组元素的数值并且求数组前K个元素的总和或平均值 时间复杂度为O(logN) ...

  9. “高级”数据结构——树状数组

    数据结构是每一个程序员都必须要学的,非常重要! 大佬的博客写的真好,虽然我看不懂..... 链接http://www.cnblogs.com/RabbitHu/p/BIT.html

  10. 树状数组(单点+区间的所有操作)

    转载:https://blog.csdn.net/I_believe_CWJ/article/details/80374326 更简洁方便的数据结构--树状数组(基于线段树的实现) 1.单点更新+区间 ...

最新文章

  1. JAVA偏向锁的什么时候释放_Java中的偏向锁
  2. C#--检索线程状态
  3. IIS服务器下做301永久重定向设置方法[图解]
  4. python 选择排序算法
  5. 命令行启动Angular应用
  6. WeScale 技术篇 —— mpvue 与微信小程序的火花
  7. Effective C++ 改善55个方法
  8. Linux驱动学习2
  9. Portainer 安装与使用
  10. MySQL数据常用命令
  11. 5G下行候选新波形简介(1)--FBMC、UFMC、GFDM
  12. 汤普森采样(Thompson sampling)
  13. AngularJs:Directive指令用法
  14. 魔兽争霸英雄英语名称
  15. Import theano gives the AttributeError: module 'theano' has no attribute 'gof'
  16. MM定理(Modigliani-Miller)证明与图解
  17. unity ,color组件
  18. 【python】python制作 连连看 游戏脚本(一)
  19. Excel使用Alt+Enter在单元格内换行
  20. springmvc笔记回顾——持续更新

热门文章

  1. Centos7.4源码搭建zabbix3.4.11企业级监控
  2. Web设计规范----控件、组件
  3. windows编译python扩展Unable to find vcvarsall
  4. sh与bash中的export语法的区别
  5. 数据中心运维管理经验39条
  6. Red Hat Cormier发布OpenShift.io和容器状态指数
  7. linux查找超过一定时间的文件,并批量删除
  8. 2016.8.7 UnicodeEncodeError 同时遍历多个list
  9. eclipse、MyEclipse实现批量改动文件编码
  10. IPC$***--个人练习