[模板]二维树状树组 单点修改 区间查询

Posted Running-Coder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[模板]二维树状树组 单点修改 区间查询相关的知识,希望对你有一定的参考价值。

输入格式:

1.输入两个整数n,m,表示矩阵的长和宽;

2.输入n行m列个整数,为矩阵的每个元素;

3.输入一个整数T,表示操作次数;

4.输入T行:

格式1:1 x y k,表示将坐标为(x,y)的点加上k;

格式2:2 x1 y1 x2 y2,表示求左上角坐标为(x1,y1),右下角坐标为(x2,y2)的矩阵内所有元素的总和。

 

输出格式:

每个输出1行,输出每次操作2的结果。

 

代码如下:

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<ctime>
  5 #include<cstdlib>
  6 //#include<cmath>
  7 
  8 #include<string>
  9 #include<stack>
 10 #include<queue>
 11 #include<vector>
 12 #include<algorithm>
 13 #include<map>
 14 
 15 using namespace std;
 16 
 17 void read(int &x){
 18     x=0;
 19     char t=getchar();
 20     bool f=0;
 21     
 22     while(t<0 || t>9){
 23         if(t==-)f=1;
 24         t=getchar();
 25     }
 26     
 27     while(t>=0 && t<=9){
 28         x=(x<<3)+(x<<1)+t-0;
 29         t=getchar();
 30     }
 31     
 32     if(f)x=-x;
 33 }
 34 
 35 void add(int,int,int);
 36 int query(int,int);
 37 
 38 int a[1010][1010];
 39 int c[1010][1010];
 40 
 41 int n,m,i,j;
 42 
 43 int T,f,x,y,k;
 44 
 45 int x1,y1,x2,y2;
 46 
 47 int main(){
 48     read(n);
 49     read(m);
 50     
 51     for(i=1;i<=n;i++)
 52         for(j=1;j<=m;j++){
 53             read(a[i][j]);
 54             add(i,j,a[i][j]);
 55         }
 56     
 57     read(T);
 58     
 59     while(T--){
 60         read(f);
 61         
 62         if(f==1){
 63             read(x);read(y);read(k);
 64             add(x,y,k);
 65         }
 66         
 67         if(f==2){
 68             read(x1);read(y1);read(x2);read(y2);
 69             printf("%d\n",query(x2,y2)-query(x2,y1-1)-query(x1-1,y2)+query(x1-1,y1-1));
 70         }
 71     }
 72     
 73     return 0;
 74 }
 75 
 76 void add(int a,int b,int x){
 77     int i=a,j;
 78     
 79     while(i<=n){
 80         j=b;
 81         
 82         while(j<=m){
 83             c[i][j]+=x;
 84             j+=j&-j;
 85         }
 86         
 87         i+=i&-i;
 88     }
 89 }
 90 
 91 int query(int a,int b){
 92     int ans=0,i=a,j;
 93     
 94     while(i>=1){
 95         j=b;
 96         
 97         while(j>=1){
 98             ans+=c[i][j];
 99             j-=j&-j;
100         }
101         
102         i-=i&-i;
103     }
104     
105     return ans;
106 }

 

以上是关于[模板]二维树状树组 单点修改 区间查询的主要内容,如果未能解决你的问题,请参考以下文章

树状数组从入门到弃疗

单点修改区间查询(树状数组)

P3374 模板树状数组 1(单点修改区间查询)(树状数组)

MangataのACM模板

ybtoj树状数组课堂过关二维树状数组 例题5单点修改区间查询

树状数组