首页 > 编程语言 > 详细

POJ 2155 二维树状数组

时间:2016-01-23 21:32:42      阅读:172      评论:0      收藏:0      [点我收藏+]

《浅谈信息学中的“0”和“1”》这篇文章给出了该题目的二维树状数组做法。因为矩阵只含0和1,所以可以采取记录每个元素被置换的次数来获得该元素最后的状态。每次置换只需让端点(x1,y1),(x1,y2+1),(x2+1,y1),(x2+1,y2+1)加一。查询的时候利用维护的树状数组,得到元素(x,y)的置换次数判断其奇偶即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #define lowbit(x) (x&(-x))
 4 int tree[1001][1001];
 5 int s;
 6 void add(int x,int y,int num)
 7 {
 8     for(int i=x;i<=s;i+=lowbit(i))
 9         for(int j=y;j<=s;j+=lowbit(j))
10             tree[i][j]+=num;
11 }
12 int read(int x,int y)
13 {
14     int num=0;
15     for(int i=x;i>0;i-=lowbit(i))
16         for(int j=y;j>0;j-=lowbit(j))
17             num+=tree[i][j];
18     return num;
19 }
20 int main()
21 {
22     int x;
23     scanf("%d",&x);
24     for(int i=0;i<x;i++)
25     {
26         int t,x1,x2,y1,y2;
27         char cmd;
28         memset(tree,0,sizeof(tree));
29         scanf("%d%d",&s,&t);
30         getchar();
31         for(int j=0;j<t;j++)
32         {
33             scanf("%c",&cmd);
34             if(cmd==C)
35             {
36                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
37                 getchar();
38                 add(x1,y1,1);
39                 add(x2+1,y2+1,1);
40                 add(x1,y2+1,1);
41                 add(x2+1,y1,1);
42             }
43             if(cmd==Q)
44             {
45                 scanf("%d%d",&x1,&y1);
46                 getchar();
47                 printf("%d\n",read(x1,y1)&1);
48             }
49         }
50         printf("\n");
51     }
52 }

 

POJ 2155 二维树状数组

原文:http://www.cnblogs.com/CodeMIRACLE/p/5153874.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!