Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=1892

二维树状数组

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int N=1010,maxn=1001;
 6 int a[N][N],c[N][N];
 7 int lowbit(int x)
 8 {
 9     return x&(-x);
10 }
11 void add(int x,int px,int py,int maxn)
12 {
13     for(int i=px;i<=maxn;i+=lowbit(i))
14         for(int j=py;j<=maxn;j+=lowbit(j)) c[i][j]+=x;
15 }
16 int sum(int px,int py)
17 {
18     int s=0;
19     for(int i=px;i>0;i-=lowbit(i))
20         for(int j=py;j>0;j-=lowbit(j)) s+=c[i][j];
21     return s;
22 }
23 int main()
24 {
25     int T,C=0;
26     scanf("%d",&T);
27     while(T--)
28     {
29         printf("Case %d:\n",++C);
30         memset(c,0,sizeof(c));
31         for(int i=1;i<=maxn;i++)
32             for(int j=1;j<=maxn;j++)
33             {
34                 a[i][j]=1;
35                 add(1,i,j,maxn);
36             }
37         int q;
38         scanf("%d",&q);
39         while(q--)
40         {
41             char op[2];
42             int x1,y1,x2,y2,n1,s;
43             scanf("%s",op);
44             switch(op[0])
45             {
46                 case 'S':
47                     scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
48                     if(x1>x2) {int t=x1; x1=x2; x2=t;}
49                     if(y1>y2) {int t=y1; y1=y2; y2=t;}
50                     x2++; y2++;
51                     s=sum(x2,y2)-sum(x1,y2)-sum(x2,y1)+sum(x1,y1);
52                     printf("%d\n",s);
53                     break;
54                 case 'A':
55                     scanf("%d%d%d",&x1,&y1,&n1);
56                     x1++; y1++;
57                     a[x1][y1]+=n1;
58                     add(n1,x1,y1,maxn);
59                     break;
60                 case 'D':
61                     scanf("%d%d%d",&x1,&y1,&n1);
62                     x1++; y1++;
63                     if(n1>a[x1][y1]) n1=a[x1][y1];
64                     a[x1][y1]-=n1;
65                     add(-n1,x1,y1,maxn);
66                     break;
67                 case 'M':
68                     scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1);
69                     x1++; y1++; x2++; y2++;
70                     if(n1>a[x1][y1]) n1=a[x1][y1];
71                     a[x1][y1]-=n1;
72                     add(-n1,x1,y1,maxn);
73                     a[x2][y2]+=n1;
74                     add(n1,x2,y2,maxn);
75                     break;
76             }
77         }
78     }
79     return 0;
80 }

 

posted on 2012-05-04 09:28  Qiuqiqiu  阅读(161)  评论(0编辑  收藏  举报