[模板]二维树状树组 单点修改 区间查询
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(单点修改区间查询)(树状数组)