树状数组模板题
核心应用:快速(logn)计算前缀和(本质上是快速给某个位置加上一个数)
求前缀和可以是任意区间,如求L~R的区间前缀和,只需要用S[R]-S[L-1],通过简单的减法运算即可知区间和
本质上的功能:它只支持单点修改和区间查询
coding上:有三个核心,求lowbit,更新,以及求和,具体的原理能够代入数成功计算理解即可
从度娘上得知,作者利用了类似于进制的表示方式,不过进制不是确定的二进制或者十进制,而是多串序列:
每一个c[i]都表示一段数的和,即一段前缀和,奇数为原数组,偶数为前缀和
https://www.acwing.com/problem/content/1266/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100010;
int n,m;
int a[N],t[N];
//树状数组三大核心函数
int lowbit(int x)//返回二进制末尾有多少个零,即2^k次方
{
return x & -x;
}
void add(int x,int v)//更新树状数组
{
for(int i=x;i<=n;i+=lowbit(i))t[i]+=v;
}
int query(int x)//求前缀和
{
int res=0;
for(int i=x;i;i-=lowbit(i))res+=t[i];
return res;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)add(i,a[i]);
while(m--)
{
int k,x,y;
scanf("%d%d%d",&k,&x,&y);
if(k==0)printf("%d\n",query(y)-query(x-1));
else add(x,y);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具