前言
先推荐几个讲解的比较好的博客或视频:
树状数组基础及应用
一、树状数组的应用
- 树状数组解决区间和
- 树状数组解决单点查询
模板如下:
int d[100005],n;
int lowbit(int x)
{
return x&(-x);
}
int query(int x)//查询前缀和
{
int res=0;
while(x)
{
res+=d[x];
x-=lowbit(x);
}
return res;
}
void add(int x,int v)//单点加操作
{
while(x<=n)
{
d[x]+=v;
x+=lowbit(x);
}
}
- 二维树状数组
模板如下:
struct BIT_2D
{
int d[301][301];
void update(int x,const int&y.const int&v)
{
for(;x<=n;x+=(x&(-x)))
for(int j=y;j<=n;j+=(j&(-j)))
d[x][j]+=V;
}
int getSum(int x,const int&y)
{
int res=0;
for(;x;x-=(x&(-x)))
for(int j=y;j;j-=(j&(-y)))
res+=d[x][j];
return res;
}
}T;
对于区间最值的问题,推荐采用线段树来写
树状数组是一种比线段树功能少,但是实现简单,常数小的数据结构