开局一张图,剩下全靠编。
对于树状数组,我的理解是有技巧的应用前缀和+神仙一般的二进制规律
1、改点求段
改点从下往上,将全部包括了这个点的c全部更改
1 int lowbit(int x) 2 { 3 return x&(-x); 4 }
1 void add(int x,int y)//将第x个数加上y 2 { 3 a[x]+=y; 4 for(int i=x;i<=n;i+=lowbit(i)) 5 { 6 c[i]+=y; 7 } 8 }
求段就是将大段分成一个一个的小段
1 int getsum(int x)//求[1,x]的和 2 { 3 int ans=0; 4 for(int i=x;i>0;i-=lowbit(i)) 5 { 6 ans+=c[i]; 7 } 8 return ans; 9 }
c数组的初始化就是在每一次输入a的时候在初始为0的a上add(i,a[i]);
原文:https://www.cnblogs.com/greenofyu/p/12257061.html