wa了十次,原来变量名写错。二维树状数组。
1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXN 1002 5 6 int nums[MAXN][MAXN]; 7 8 void swap(int *x, int *y) { 9 int tmp; 10 tmp = *x; 11 *x = *y; 12 *y = tmp; 13 } 14 15 int lowbit(int i) { 16 return i & (-i); 17 } 18 19 void add(int x, int y, int v) { 20 for (int i=x; i<MAXN; i+=lowbit(i)) 21 for (int j=y; j<MAXN; j+=lowbit(j)) 22 nums[i][j] += v; 23 } 24 25 void build() { 26 int i, j; 27 memset(nums, 0, sizeof(nums)); 28 for (i=1; i<MAXN; ++i) 29 for (j=1; j<MAXN; ++j) 30 add(i, j, 1); 31 } 32 33 int query(int x, int y) { 34 int val = 0; 35 for (int i=x; i>0; i-=lowbit(i)) 36 for (int j=y; j>0; j-=lowbit(j)) 37 val += nums[i][j]; 38 return val; 39 } 40 41 int main() { 42 int t, n; 43 int x1, y1, x2, y2, v, tmp; 44 int in; 45 char cmd[3]; 46 47 scanf("%d", &t); 48 for (in=1; in<=t; ++in) { 49 build(); 50 scanf("%d", &n); 51 printf("Case %d: ", in); 52 while (n--) { 53 scanf("%s", cmd); 54 if (cmd[0] == 'S') { 55 scanf("%d %d %d %d", &x1, &y1, &x2, &y2); 56 ++x1; ++y1; ++x2; ++y2; 57 if (x1 > x2) 58 swap(&x1, &x2); 59 if (y1 > y2) 60 swap(&y1, &y2); 61 v = query(x2,y2) - query(x1-1,y2) - query(x2,y1-1) + query(x1-1,y1-1); 62 printf("%d ", v); 63 } else if (cmd[0] == 'M') { 64 scanf("%d %d %d %d %d", &x1,&y1,&x2,&y2,&v); 65 ++x1; ++y1; ++x2; ++y2; 66 tmp = query(x1-1,y1-1) - query(x1-1,y1) - query(x1,y1-1) + query(x1,y1); 67 if (v > tmp) 68 v = tmp; 69 add(x1, y1, -v); 70 add(x2, y2, v); 71 } else if (cmd[0] == 'A') { 72 scanf("%d %d %d", &x1, &y1, &v); 73 ++x1; ++y1; 74 add(x1, y1, v); 75 } else if (cmd[0] == 'D') { 76 scanf("%d %d %d", &x1, &y1, &v); 77 ++x1; ++y1; 78 tmp = query(x1-1,y1-1) - query(x1-1,y1) - query(x1,y1-1) + query(x1,y1); 79 if (v > tmp) 80 v = tmp; 81 add(x1, y1, -v); 82 } 83 } 84 } 85 86 return 0; 87 }