POJ2155 Matrix

  原题传送:http://poj.org/problem?id=2155

  楼教神题,二维树状数组。

  弄懂一维树状数组,二维的也不难懂。可以参考NOCOW

  需要注意的是,修改的四个点分别是(x1, y1), (x2+1, y1), (x1, y2+1), (x2+1, y2+1),而不是(x1, y1), (x2, y1), (x1, y2), (x2, y2),因为如果是后者的话,(x2, y2)会被4次覆盖(也就是点(x2, y2)不会被改变)。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 1001
 4 typedef long long LL;
 5 
 6 LL c[N][N];
 7 
 8 LL lowbit(LL x)
 9 {
10     return x & (-x);
11 }
12 
13 void modify(int x, int y)
14 {
15     for(int i = x; i < N; i += lowbit(i))
16     for(int j = y; j < N; j += lowbit(j))
17         c[i][j] ++;
18     return ;
19 }
20 
21 LL query(int x, int y)
22 {
23     LL ans = 0;
24     for(int i = x; i > 0; i -= lowbit(i))
25     for(int j = y; j > 0; j -= lowbit(j))
26         ans += c[i][j];
27     return ans;
28 }
29 
30 int main()
31 {
32     int cas, n, tt, t, x1, y1, x2, y2;
33     char op[3];
34     scanf("%d", &tt);
35     for(cas = 1; cas <= tt; cas ++)
36     {
37         if(cas != 1)    
38             putchar('\n');
39         memset(c, 0, sizeof c);
40         scanf("%d%d", &n, &t);
41         while(t --)
42         {
43             scanf("%s", op);
44             if(op[0] == 'C')
45             {
46                 scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
47                 modify(x1, y1);
48                 modify(x2 + 1, y1);
49                 modify(x1, y2 + 1);
50                 modify(x2 + 1, y2 + 1);
51             }
52             else if(op[0] == 'Q')
53             {
54                 scanf("%d%d", &x1, &y1);
55                 printf("%I64d\n", query(x1, y1) & 1);
56             }
57         }
58     }
59     return 0;
60 }
posted @ 2012-10-18 14:56  芒果布丁  阅读(186)  评论(0编辑  收藏  举报