二维树状数组模板

完全版

 1 #include <cstdio>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 int lowbit(int x)
 7 {
 8     return x&(-x);
 9 }
10 struct tree_arr
11 {
12     int c[1005];
13     tree_arr()
14     {
15         clear();
16     }
17     void clear()
18     {
19         memset(c,0,sizeof(c));
20     }
21     int get_sum(int x)
22     {
23         int sum=0;
24         while(x)
25         {
26             sum+=c[x];
27             x-=lowbit(x);
28         }
29         return sum;
30     }
31     void update(int x,int d,int n)
32     {
33         while(x<=n)
34         {
35             c[x]+=d;
36             x+=lowbit(x);
37         }
38     }
39 } r[1005];
40 int get_sum(int x,int y)///(x,y)
41 {
42     int sum=0;
43     while(x)
44     {
45         sum+=r[x].get_sum(y);
46         x-=lowbit(x);
47     }
48     return sum;
49 }
50 void update(int x,int y,int d,int n,int m)///n行,m列
51 {
52     while(x<=n)
53     {
54         r[x].update(y,d,m);
55         x+=lowbit(x);
56     }
57
58 }
59 int main()
60 {
61     int i,j,n=10,m=10;
62     memset(r,0,sizeof(r));
63     for(i=1; i<=n; i++)
64     {
65         for(j=1; j<=m; j++)
66         {
67             update(i,j,1,n,m);
68         }
69     }
70     for(i=1; i<=n; i++)
71     {
72         for(j=1; j<=m; j++)
73         {
74             printf("%3d ",get_sum(i,j));
75         }
76         puts("");
77     }
78     return 0;
79 }

简化版

 1 int c[MAX][MAX];
 2 int n,m;
 3 int Lowbit(int x)
 4 {
 5     return x & (-x);
 6 }
 7 void Updata(int x,int y,int d)
 8 {
 9     int i,k;
10     for(i=x; i<=n; i+=Lowbit(i))
11         for(k=y; k<=m; k+=Lowbit(k))
12             c[i][k]+=d;
13 }
14 int Get(int x,int y)
15 {
16     int i,k,sum = 0;
17     for(i=x; i>0; i-=Lowbit(i))
18         for(k=y; k>0; k-=Lowbit(k))
19             sum += c[i][k];
20     return sum;
21 } 
时间: 2024-10-25 06:02:31

二维树状数组模板的相关文章

poj 1195 二维树状数组 及二维树状数组模板

http://poj.org/problem?id=1195 求矩阵和的时候,下标弄错WA了一次... 求矩形(x1,y1) (x2,y2)的sum |sum=sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1) 二维树状数组讲解:http://blog.csdn.net/u011026968/article/details/38532117 二维树状数组模板: /*========================================

二维树状数组模板(区间修改+区间查询)

二维树状数组模板(区间修改+区间查询) 例题:JOIOI上帝造题的七分钟 一共两种操作: \(L\ x_1\ y_1\ x_2\ y_2\ d\):把\((x_1,y_1)\),\((x_2,y_2)\)这个矩形内所有元素加\(d\). \(k\ x_1\ y_1\ x_2\ y_2\):查询\((x_1,y_1)\),\((x_2,y_2)\)这个矩形内所有元素的和. 代码如下: #include<bits/stdc++.h> #define RG register #define IL i

POJ1195(二维树状数组)

Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 17176   Accepted: 7920 Description Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The area is divided into squares. The

一维 + 二维树状数组 + 单点更新 + 区间更新 详解

树状数组详解: 假设一维数组为A[i](i=1,2,...n),则与它对应的树状数组C[i](i=1,2,...n)是这样定义的: C1 = A1 C2 = A1 + A2 C3 = A3 C4 = A1 + A2 + A3 + A4 C5 = A5 C6 = A5 + A6 ................. C8 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 ................ 如图可知: 为奇数的时候他是代表他本身,而为偶数的时候则是代表着自

poj2155 Matrix 【二维树状数组】

有工具在手,这题就是一个模板题,就是有点不清楚,最后问的是单个元素的值,它怎么sum求出来的 #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; #define maxn 1005 int c[maxn][maxn]; int Row, Col; inline int Lowbit(const int &x)

HLJU 1188 Matrix (二维树状数组)

Matrix Time Limit: 4 Sec  Memory Limit: 128 MB Description 给定一个1000*1000的二维矩阵,初始矩阵中每一个数都为1,然后为矩阵有4种操作. S x1 y1 x2 y2:计算(x1,y1).(x2,y2)围成的矩阵内全部元素的和. A x y v:将(x,y)添加v D x y v:将(x,y)降低v M x1 y1 x2 y2 v:将(x1,y1)元素中的v转移到(x2,y2)中去. 全部操作数都为正数. 若某一操作将矩阵中元素降

【poj1195】Mobile phones(二维树状数组)

题目链接:http://poj.org/problem?id=1195 [题意] 给出一个全0的矩阵,然后一些操作 0 S:初始化矩阵,维数是S*S,值全为0,这个操作只有最开始出现一次 1 X Y A:对于矩阵的X,Y坐标增加A 2 L B R T:询问(L,B)到(R,T)区间内值的总和 3:结束对这个矩阵的操作 [思路] 二维树状数组单点更新+区域查询,可作为模板题. 注意坐标是从0开始,所以要+1 [代码] 1 #include<cstdio> 2 #include<cstrin

YBT1540打鼹鼠_二维树状数组

1540:打鼹鼠_二维树状数组 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 这是一道模板题. 给出一个 n×m 的零矩阵 A,你需要完成如下操作: 1 x y k:表示元素 Ax,y自增 k: 2 a b c d:表示询问左上角为 (a,b),右下角为 (c,d) 的子矩阵内所有数的和. [输入] 输入的第一行有两个正整数 n,m: 接下来若干行,每行一个操作,直到文件结束. [输出] 对于每个 2 操作,输出一个整数,表示对于这个操作的回答. [输

【二维树状数组】See you~

https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A x y n1 :给格点(x,y)的值加n1 D x y n1: 给格点(x,y)的值减n1,如果现在格点的值不够n1,把格点置0 M x1 y1 x2 y2:(x1,y1)移动给(x2,y2)n1个 S x1 y1 x2 y2 查询子矩阵的和 [思路] 当然是二维树状数组 但是一定要注意:lowbi