各版本树状数组 二维树状数组

  单点更新,区间查询

 1 //树状数组:单点更新,区间查询
 2 int n,c[K];
 3 void add(int x,int v)
 4 {
 5     while(x<=n) c[x]+=v,x+=x&-x;
 6 }
 7 int get_sum(int x)
 8 {
 9     int ret=0;
10     while(x) ret+=c[x],x-=x&-x;
11     return ret;
12 }

 区间增减,单点查询

 1 //树状数组:区间增减,单点查询
 2 //修改区间[l,r]时:add(l,v),add(r+1,-v)
 3 int n,c[K];
 4 void add(int x,int v)
 5 {
 6     while(x<=n) c[x]+=v,x+=x&-x;
 7 }
 8 int get_sum(int x)
 9 {
10     int ret=0;
11     while(x) ret+=c[x],x-=x&-x;
12     return ret;
13 }

区间增减,区间查询

 1 //树状数组:区间增减,区间查询
 2 //修改区间[l,r]时:add(l,v),add(r+1,-v)
 3 int n,c1[K],c2[K];
 4 void add(int x,int v)
 5 {
 6     for(int i=x;i<=n;i+=i&-i) c1[i]+=x,c2[i]+=x*v;
 7 }
 8 int get_sum(int x)
 9 {
10     int ret=0;
11     for(int i=x;i<=n;i-=i&-i) ret+=x*c1[i]-c2[i];
12     return ret;
13 }

二维树状数组:单点修改,区间查询

 1 //二维树状数组:单点修改,区间查询
 2 int c[K][K],N=1e3+5;
 3 void add(int x,int y,int v)
 4 {
 5     for(int i=x;i<=N;i+=i&(-i))
 6     for(int j=y;j<=N;j+=j&(-j))
 7         c[i][j]+=v;
 8 }
 9 int get_sum(int x,int y)
10 {
11     int ret=0;
12     for(int i=x;i;i-=i&(-i))
13     for(int j=y;j;j-=j&(-j))
14         ret+=c[i][j];
15     return ret&1;
16 }

二维树状数组:区间修改,单点查询

 1 //二维树状数组:区间修改,单点查询
 2 //修改矩形区域:(lx,ly),(lx,ry),(rx,ly),(rx,ry)时
 3 //add(lx,ly,v),add(rx+1,ry+1,v),add(lx,ry+1,-v),add(rx+1,ly,-v);
 4 int c[K][K],N=1e3+5;
 5 void add(int x,int y,int v)
 6 {
 7     for(int i=x;i<=N;i+=i&(-i))
 8     for(int j=y;j<=N;j+=j&(-j))
 9         c[i][j]+=v;
10 }
11 int get_sum(int x,int y)
12 {
13     int ret=0;
14     for(int i=x;i;i-=i&(-i))
15     for(int j=y;j;j-=j&(-j))
16         ret+=c[i][j];
17     return ret&1;
18 }
原文地址:https://www.cnblogs.com/weeping/p/6839038.html