首页 > 其他分享 >树状数组模板题

树状数组模板题

时间:2022-10-14 17:45:50浏览次数:82  
标签:前缀 树状 int 数组 区间 include 模板

核心应用:快速(logn)计算前缀和(本质上是快速给某个位置加上一个数)
求前缀和可以是任意区间,如求L~R的区间前缀和,只需要用S[R]-S[L-1],通过简单的减法运算即可知区间和
本质上的功能:它只支持单点修改和区间查询
coding上:有三个核心,求lowbit,更新,以及求和,具体的原理能够代入数成功计算理解即可

从度娘上得知,作者利用了类似于进制的表示方式,不过进制不是确定的二进制或者十进制,而是多串序列:

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)
{
	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;
}

 

标签:前缀,树状,int,数组,区间,include,模板
From: https://www.cnblogs.com/lxl-233/p/16792409.html

相关文章