1.树状数组在很多情况下可以替代线段树,而且树状数组的代码简洁好写,所以能用树状数组的地方我还是会树状数组而不是线段树;
2.树状数组的常用的函数有以下这些:
int lowbit(int x) { return x&(-x); }
void update(int x,int num) { while(x<=n) { sum[x]+=num; x+=lowbit(x); } } /*从下往上修改,对应线段树的点修改*/ int query(int x) { int s=0; while(x>0) { s+=sum[x]; x-=lowbit(x); } return s; } /*从上向下统计,对应线段树的区间统计*/ void update(int x,int num) { while(x>0) { d[x]+=num; x-=lowbit(x); } } /*从上往下修改,需要两次,第二次要把多加的区间减掉我感觉像是线段树的lazy标记,不知道对不对*/ int getSum(int x) { int s=0; while(x<=N) { s+=d[x]; x+=lowbit(x); } return s; } /*点查询,从下向上统计,对应线段树的点查询要加上lazy标记*/
3.某些题目的区间修改可以改成点修改,然后区间查询如hdu1556,poj2155(二维的树状数组好神奇);