poj 1195 mobile phone

题目连接:

题意:要求设计这样一个数据结构,支持下列操作

1.add(x,y,a).对二维数组的第x行,第y列加上a.

2.sum(l,b,r,t).求所有满足l<=x<=r,b<=y<=t,的数组元素的和

二位树状数组~

 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #define loop(s,i,n) for(i = s;i <= n;i++)
 6 #define lowbit(x) x&-x
 7 using namespace std;
 8 int c[1050][1050];
 9 int n;
10 void add(int a,int b,int val)
11 {
12     int i,j;
13     for(i = a;i <= n;i += lowbit(i))
14     {
15         for(j = b;j <= n;j += lowbit(j))
16         c[i][j] += val;
17     }
18 }
19 
20 int sum(int a,int b)
21 {
22     int res = 0;
23     int i,j;
24     for(i = a;i > 0;i -= lowbit(i))
25     {
26         for(j = b;j > 0;j -= lowbit(j))
27         res+=c[i][j];
28     }
29     return res;
30 }
31 int main()
32 {
33     int t,i,j,a,b,l,r;
34     while(~scanf("%d",&t) != EOF)
35     {
36         if(!t)
37         {
38             scanf("%d",&n);
39             loop(1,i,n)
40             {
41                 loop(1,j,n)
42                 c[i][j] = 0;
43             }
44         }
45         if(t == 1)
46         {
47             scanf("%d %d %d",&a,&b,&l);
48             add(a+1,b+1,l);
49         }
50         else if(t == 2)
51         {
52             scanf("%d %d %d %d",&a,&b,&l,&r);
53             printf("%d
",sum(a,b)+sum(l+1,r+1)-sum(a,r+1)-sum(l+1,b));
54         }
55         if(t == 3)
56         break;
57     }
58     return 0;
59 }
View Code
原文地址:https://www.cnblogs.com/0803yijia/p/3214081.html