一维树状数组
我在网上搜索到一些优秀的博客学习的树状数组,以下是参考的博客:
1.搞懂树状数组:点击打开链接
2.树状数组学习笔记:点击打开链接
3.完全认识树状数组:点击打开链接
4.还有算法训练指南中的讲解;
以上的链接是关于树状数组的原理讲解;
随着时间推移可能会忘记,做题的时候可以画一个图解便于回忆树状数组的原理(训练指南上的图解比较好! )
一棵典型的BIT:
更新:
统计:
//心得:
刚开始用树状数组写题的时候,不知道如何下手。这个树状数组的更新函数add(),向上更新。很多的题目的是这样调用的:add(x,1);就是标记x了一次。一般都是这么用的,后面几篇博客是题目;
//树状数组使用注意:
1.离散化;
2.如果代码TLE的话,检查一下是不是下标0的问题;
3.题目若需排序,考虑一下应当怎样正确排序;
4.代码一定要敲仔细;
下面是自己学习的代码:
int lowbit(int k) //把k的二进制的高位1全部清空,只留下最低位的1;
{
return k&(-k);
}
int sum(int x)
{
int ret=0;
while(x>0)
{
ret+=C[x];
x-=lowbit(x);
}
return ret;
}
void add(int x,int d)
{
while(x<=N)
{
C[x]+=d;
x+=lowbit(x);
}
}
int N;
int c[maxn][maxn];
inline int lowbit(int t)
{
return t&(-t);
}
void add(int x,int y,int v)
{
for (int i=x; i<=N; i+=lowbit(i))
for (int j=y; j<=N; j+=lowbit(j))
c[i][j]+=v;
}
int query(int x,int y)
{
int s=0;
for (int i=x; i>0; i-=lowbit(i))
for (int j=y; j>0; j-=lowbit(j))
s+=c[i][j];
return s;
}
int sum(int x,int y,int xx,int yy)
{
x--,y--;
return query(xx,yy)-query(xx,y)-query(x,yy)+query(x,y);
}