树状数组

2021年7月29

1、算法原理

树状数组解决什么问题?

解决区间上点更新与维护的问题。如更改某些点值求区间和,或求某位前有多少比其小的问题。

其实现的原理是什么?

首先看图:

在这个图中,将每1<<i个数(0<=i<=n)分为一组 ,此时设置函数lowbit(i),此函数将i的2进制中最后一位1前的数字全部删去,如lowbit(6)=4。

由图可看出,对于每个i,其都存在在其本身与i+lowbit(i)的区间数组内。例如:5—>101,101+1=110,此时存在于下标为6的区间内,随后,110+10=1000,1000+1000=10000,因此,5同时存在于下标为8与下标为16的区间内。

由此,可对数组进行更新操作:

for( ;i <= n; i+=lowbit(i)){tre[i]+=1;//此处不一定为1,根据题目不同更改,先对应下面样例
}

对于最大值为n的树状数组,每次将i加入相应区间。

那么,怎么进行查询操作?

对于一个数i可知,小于等于其本身的数字一定都存在于比其下标更小的数组里。因此此处依然可以按照二进制位进行查询,为了避免重复查询,依次进行i-lowbir(i)的操作进行查询,如:11—>1011,1011-1=1010,1010-10=1000,1000-1000=0(若下标从1开始可不要),此时查询的下标为10,8,由图可知,所有小于等于11的数字,均存在于下标为10和8的数组内。

因此有查询操作:

for( ; i > 0; i-=lowbit(i)){res+=tre[i];
}

2、模板题:

描述:

第一行输入一个n,接下来一行输入n个数,为a1…an,1<=ai<=1e4。

接下来一行输出n个数,对于每个ai,输出其之前比它小的数字的数量。

#include<iostream>
#include<algorithm>
#include<stdio.h>using namespace std;int n,num;
int tre[1005],ans[1005];int lowbit(int i){return (i & -i);
}void settre(int i){for( ; i < 1005; i += lowbit(i)){tre[i]++;}
}int solvetre(int i){int res = 0;for( ; i; i -= lowbit(i)){res+=tre[i];}return res;
}int main(){cin>>n;for(int i = 1; i <= n; i++){cin>>num;ans[i]=solvetre(num-1);settre(num);}cout<<ans[1];for(int i = 2; i <= n; i++){cout<<' '<<ans[i];}cout<<'\n';return 0;
}

输入样例:

9
1 5 2 9 4 1 7 8 3

输出样例:

0 1 1 3 2 0 5 6 3

3、实操例题

ACwing 242. 一个简单的整数问题

分析:

本题应将第i个数的差分存入树状数组,以便查询。

AC代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string>
#include<string.h>
typedef long long ll;using namespace std;int n, m, num;
int a, b;
ll tre[100005];
int sic[100005];
string k;ll lowbit(ll i) {return (i & -i);
}void settre(int i, int c) {for (; i < n + 1; i += lowbit(i)) {tre[i] += c;}
}ll solvetre(int i) {ll res = 0;for (; i; i -= lowbit(i)) {res += tre[i];}return res;
}int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> sic[i];}for (int i = 1; i <= n; i++) {settre(i, sic[i] - sic[i - 1]);}while(m--){cin >> k;if (k == "Q") {cin >> num;cout << solvetre(num) << endl;}else {cin >> a >> b >> num;settre(a, num); settre(b + 1, -num);}}return 0;
}

树状数组基础原理与模板相关推荐

  1. poj 3486 A Simple Problem with Integers(树状数组第三种模板改段求段)

    1 /* 2 树状数组第三种模板(改段求段)不解释! 不明白的点这里:here! 3 */ 4 #include<iostream> 5 #include<cstring> 6 ...

  2. 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间

    从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...

  3. 树状数组成段更新模板

    这个成段的编写复杂度很低,不需要加大空间复杂度,便于处理成段加,询问每个位置的值的操作: #include <bits/stdc++.h> using namespace std ; ty ...

  4. hdu 1166 敌兵布阵 树状数组 模板题

    这题是树状数组入门的一模板题,非常基础,被小白成为"赤裸裸"的入门题,哈哈,一个plus,一个sum全部搞定 #include<stdio.h> #include< ...

  5. 树状数组详解(附图解,模板及经典例题分析)

    导言 深藏于算法与数据结构中的思想非常的美妙,尤其是当我们一个一个攻克其中的难点,体会其中蕴含的"哲理"时, A 题的自信力也会有所增加,心情也会格外的舒爽.最近重新接触了树状数组 ...

  6. 树状数组 数据结构详解与模板(可能是最详细的了)

    目录 转载请注明出处:bestsort.cn 树状数组基础 单点更新: 区间查询: 高级操作 求逆序对 操作 原理 求区间最大值 区间修改+单点查询 查询 修改 区间修改+区间查询 查询 修改 二维树 ...

  7. 树状数组萌新讲解+基础习题【一点一滴】

    树状数组基础篇 树状数组讲点 中文名:树状数组 英文名:Binary Indexeds Tree 英译中:二进制索引树 这特么多清楚 引入: 给你n个数 1. 求区间的的和 2. 改变某个值 然后朴素 ...

  8. 洛谷P3374 【模板】树状数组 1

    题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...

  9. 树状数组的理解(前缀和 and 差分)

    二更-- 有神仙反映数星星那个题外链炸了,我决定把图给你们粘一下,汉语翻译的话在一本通提高篇的树状数组那一章里有,同时也修改了一些汉语语法的错误 这段时间学了线段树组,当神仙们都在学kmp和hash的 ...

最新文章

  1. WMI技术介绍和应用——总结(完)
  2. oracle索引块和数据块,Oracle中,如何确定热快是数据块还是索引快?
  3. 用Java中的抽象类扩展抽象类
  4. 听说,高手都用记事本写C语言代码?
  5. 数据结构之内部排序一
  6. python装饰器的应用案例
  7. vos3000 2009 3000 4.0-8.0客户端下载
  8. 山西省行政村边界数据/乡镇街道边界数据/行政区划边界分布
  9. rhino java api demo_用 Rhino 脚本化 Java
  10. Mind思维导图-在线
  11. 电子邮件客户端:Mail Pilot 3 for Mac
  12. Angr-CTF学习笔记11-13
  13. 计算机慢的解决方法,电脑很卡反应很慢该如何处理【解决方法】
  14. Java 程序员,真的不能去外包吗?
  15. 20211219 小信号建模——状态空间法
  16. 计算机主板会自动切断电源是怎么回事,告诉你电脑自动断电怎么办
  17. 迅雷下载百度云大小文件(实现极速下载)
  18. window下创建mysql 库
  19. 计算机专业考研复习方法,2014年东北大学计算机专业——关于考研我个人的复习方法...
  20. 常用9011-9018三极管参数

热门文章

  1. 20应用统计考研复试要点(part16)--应用多元分析
  2. SAP Spartacus 如何使用 cypress 进行端到端自动化测试
  3. SAP Spartacus b2b 页面 popover append to body与否的不同行为
  4. Angular Injector.create的工作原理
  5. 关于Angular里给Component protected方法写单元测试的技巧
  6. 程序员自我修养的4个阶段
  7. Angular应用里input字段后面的_ngcontent-hqi是什么含义
  8. Angular 页面元素的DOM级别的删除过程
  9. Gateway internal_length debug with Sara Zhang
  10. SAP CRM IPC and configuration page debugs