poj1195

题意:给定一个矩阵有查询有添加操作。

hit :很明显是二维树状数组(第一道二维fenwick哈)

横向纵向维护两个树状数组所以是二维,详见代码

  1 //二维树状数组

 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 const int MAX=1024 +10;
 7 int c[MAX][MAX];
 8 int n;
 9 int lowbit(int x)
10 {
11     return x&(-x);
12 }
13 void add(int x,int y,int d)
14 {
15     for(int i=x;i<=n;i+=lowbit(i))
16     {
17         for(int j=y;j<=n;j+=lowbit(j))
18         {
19             c[i][j]+=d;
20         }
21     }
22 }
23 int sum(int x,int y)
24 {
25     int ans=0;
26     for(int i=x;i>=1;i-=lowbit(i))
27     {
28         for(int j=y;j>=1;j-=lowbit(j))
29         {
30             ans+=c[i][j];
31         }
32     }
33     return ans;
34 }
35 int main()
36 {
37     int s,x,y,a;
38     int x1,x2,y2,y1;
39     memset(c,0,sizeof(c));
40     while(scanf("%d",&s)&&s!=3)
41     {
42         if(s==0) scanf("%d",&n);
43         else if(s==1)
44         {
45             scanf("%d %d %d",&x,&y,&a);
46             add(x+1,y+1,a);
47         }
48         else
49         {
50             scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
51             x1++,x2++,y1++,y2++;
52             long long ans=sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1);
53             printf("%lld\n",ans);
54         }
55     }
56     return 0;
57 }
posted @ 2014-01-26 23:03  acvc  阅读(325)  评论(0编辑  收藏  举报