树状数组 - 高级数据结构
引入
数列操作
本题是 树状数组
模板题,这个算法最大的优点是查询速度很快
col1 | 修改(add) | 求和查询(query) | 构造(init) |
---|---|---|---|
树状数组 | |||
数组 |
所以树状数组适合数据范围大,查询次数多的时候使用
实现
lowbit()
见多识广的同学都知道这个函数,它的目的是求出一个数二进制中最低位的1的位置,并将位置转化成十进制
举个例子:
如何实现lowbit()呢?
众所周知,补码本质就是原码的反码加一
于是我们可以简化代码:
int lowbit(int x)
{
return x & -x;
}
树状数组
结构:树
树状数组其实是前缀和
的变形,或者说,前缀和本身就是没有修改操作的树状数组。
聪明绝顶(物理)的科学家发现C数组(存树)的二进制下标对应了它所涵盖的数的数量,得出公式:
根据一根头发的观察发现,要找到一个点的父亲,我们需要将此点的二进制下标加上
即
举个栗子:
我们前面说过,树状数组支持两种操作(修改和求和),下方展开说明
修改
结合以上知识,我们直接从
void add(int a, int b)
{
for(; a <= n; a += lowbit(a))
tree[a] += b;
}
查询求和
大概意思是将
我也不知道怎么解释,看动图吧
LL query(int a)
{
LL sum = 0;
while(a >= 1)
{
sum += tree[a]; // 求和
a -= lowbit(a); // 分割
}
return sum;
}
构造
遍历整个待构造的数组,把每个点都加入树状数组即可
void init()
{
for(int i = 1; i <= n; i++) // 遍历
{
LL a;
cin >> a;
add(i, a); // 加入树状数组
}
}
对了,记得开long long
Talk is cheap, show me the code!
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int n, m;
LL tree[1000010];
inline LL read() // 快读,不然不保证能稳定过
{
LL s = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
return f * s;
}
int lowbit(int x)
{
return x & -x;
}
LL query(int a) // 查询求和
{
LL sum = 0;
while(a >= 1)
{
sum += tree[a];
a -= lowbit(a);
}
return sum;
}
void add(int a, int b) // 加入树状数组
{
for(; a <= n; a += lowbit(a))
tree[a] += b;
}
void init()
{
for(int i = 1; i <= n; i++)
{
LL a;
cin >> a;
add(i, a);
}
}
int main()
{
n = read();
m = read();
init();
for(int i = 1; i <= m; i ++)
{
int op;
op = read();
LL a, b;
a = read(), b = read(); // 读入
if(op == 1) // 哪个操作呢
add(a, b); // 加边加边加边
else
printf("%lld\n", query(b) - query(a - 1)); // 1~b的区间和 - 1~a-1的区间和即为 a~b的区间和
// 然后并查集查询(大雾)
}
return 0;
}
蒟蒻的题解难免有误,恳请dalao指出!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!