首页 > 代码库 > 树状数组(二)与poj2155 - matrix

树状数组(二)与poj2155 - matrix

 

  今天下午,我进行了树状数组的进一步学习[1],并完成了poj2155的编程与调试,下面是一些记录与感想。

 

  这道题目是一道二维树状数组的练习,中心思想如下:

    1、C(x1, y1)(x2, y2)可以用c[x1][y1]++、c[x2 + 1][y1]++、c[x1][y1 + 1]--、c[x2 + 1][y2 + 1]--进行记录(证明与推理过程在注释[1]中)。

    2、Q(x, y)利用二维树状数组对c[1][1]到c[x][y]的累加和%2(即mod 2)求得(请各位参看注释[1]的资料自行检验)。

 

  我的代码如下:

 1 //以下是C++代码
 2 
 3 #include<cstdio>
 4 #include<cstring>
 5 
 6 int x, c[1005][1005] = {0};
 7 
 8 void change(const int &n);                       //对指令‘C‘执行此函数
 9 int quesion();                                   //对指令‘Q‘执行此函数
10 void do_change(const int &n, int x, int y, int va);
11 inline int lowbit(const int &x);
12 
13 int main()
14 {
15     bool boo_first(true);
16     scanf("%d", &x);
17     for(int i = 1; i<=x; ++i)
18     {
19         int n, t;
20         if(boo_first) boo_first = false;//多组数据间插入空行
21         else printf("\n");
22         memset(c, 0, sizeof(c));
23         scanf("%d%d", &n, &t);
24         for(int j = 1; j <= t; ++j)
25         {
26             getchar();
27             char ch(getchar());
28             if(ch == C) change(n);
29             else if(ch == Q) printf("%d\n", quesion());
30         }
31     }
32 }
33 
34 void change(const int &n)
35 {
36     int x_b, y_b, x_e, y_e;
37     scanf("%d%d%d%d", &x_b, &y_b, &x_e, &y_e);
38         //对x1,x2,y1,y2分别更新c数组
39     do_change(n, x_b, y_b, 1);
40     do_change(n, x_b, y_e + 1, -1);
41     do_change(n, x_e + 1, y_b, 1);
42     do_change(n, x_e + 1, y_e + 1, -1);
43 }
44 
45 int quesion()
46 {
47     int x, y, sum(0);
48     scanf("%d%d", &x, &y);
49     while(x > 0)                              //利用树状数组进行求和
50     {
51         int y1(y);
52         while(y1 > 0)
53         {
54             sum += c[x][y1];
55             y1 -= lowbit(y1);
56         }
57         x -= lowbit(x);
58     }
59     return sum % 2;
60 }
61 
62 void do_change(const int &n, int x, int y, int va)
63 {
64     while(x <= n)                            //对二维树状数组进行更改
65     {
66         int y1(y);
67         while (y1 <= n)
68         {
69             c[x][y1] += va;
70             y1 += lowbit(y1);
71         }
72         x += lowbit(x);
73     }
74 }
75 
76 inline int lowbit(const int &x)
77 {
78     return x & (-x);
79 }

   

  感想:做这一题,我花的时间比前一次少了不少,一维的树状数组理解了原理,二维的基本可以直接迁移。不过,本人认为这题的题目有点坑,输入两组数据间无空行,输出两组数据间要空一行……

 

  注释:[1]:http://www.cnblogs.com/justforgl/archive/2012/07/27/2612364.html

 

 

  (转载请注明出处)

树状数组(二)与poj2155 - matrix