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