标签:poj mod org on() mic 二维 etc log sizeof
今天下午,我进行了树状数组的进一步学习[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
(转载请注明出处)
标签:poj mod org on() mic 二维 etc log sizeof
原文地址:http://www.cnblogs.com/homeworld/p/6387183.html