树状数组模板题

核心应用:快速(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;
}

 

posted @   风乐  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示