hdu 1892【二维树状数组】

O(∩_∩)O哈哈~二维树状数组被我搞出来了,太开心了,第一道二维树状数组,(~ o ~)~zZ

虽然中途还是出问题了,就是S询问的时候我没有考虑坐标的大小问题,还是搜了别人的代码才知道的,看来自己考虑问题不周到,~~~~(>_<)~~~~

View Code
 1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4
5 int book[1005][1005];
6 int size = 1002;
7 void insert(int x,int y,int num)
8 {
9 for(int i = x;i <= size;i += (i&(-i)))
10 {
11 for(int j = y;j <= size;j += (j&(-j)))
12 {
13 book[i][j] += num;
14 }
15 }
16 }
17
18 int getsum(int x,int y)
19 {
20 int sum = 0;
21 for(int i = x;i > 0;i -= (i&(-i)))
22 {
23 for(int j = y;j > 0;j -= (j&(-j)))
24 {
25 sum += book[i][j];
26 }
27 }
28 return sum;
29 }
30 void init()
31 {
32 for(int i = 1;i <= size;i ++)
33 {
34 for(int j = 1;j <= size;j ++)
35 {
36 insert(i,j,1);
37 }
38 }
39 }
40 int main()
41 {
42 int T,cas = 1;
43 scanf("%d",&T);
44 while(T -- )
45 {
46 printf("Case %d:\n",cas ++);
47 int n;
48 scanf("%d",&n);
49 memset(book,0,sizeof(book));
50 init();
51 char s[3];
52 while( n --)
53 {
54 scanf("%s",s);
55 if(s[0] == 'S')
56 {
57 int a,b,c,d;
58 scanf("%d%d%d%d",&a,&b,&c,&d);
59 if(a > c) std::swap(a,c);//!
60 if(b > d) std::swap(b,d);
61 printf("%d\n",getsum(c+1,d+1)+getsum(a,b)-getsum(c+1,b)-getsum(a,d+1));
62 }
63 else if(s[0] == 'A')
64 {
65 int a,b,c;
66 scanf("%d%d%d",&a,&b,&c);
67 insert(a+1,b+1,c);
68 }
69 else if(s[0] == 'D')
70 {
71 int a,b,c;
72 scanf("%d%d%d",&a,&b,&c);
73 int num = getsum(a+1,b+1) + getsum(a,b) - getsum(a,b+1) - getsum(a+1,b);
74 if(num < c)
75 insert(a+1,b+1,-num);
76 else
77 insert(a+1,b+1,-c);
78 }
79 else if(s[0] == 'M')
80 {
81 int a,b,c,d,e;
82 scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
83 int num = getsum(a+1,b+1) + getsum(a,b) - getsum(a,b+1) - getsum(a+1,b);
84 if(num < e)
85 {
86 insert(a+1,b+1,-num);
87 insert(c+1,d+1,num);
88 }
89 else
90 {
91 insert(a+1,b+1,-e);
92 insert(c+1,d+1,e);
93 }
94 }
95 }
96 }
97 return 0;
98 }

还有就是坐标从0,0开始的,要记得加1……细节~~~

原文地址:https://www.cnblogs.com/Shirlies/p/2414339.html