poj 2155 Matrix

来源:互联网 发布:如何提取整套的源码 编辑:程序博客网 时间:2024/04/29 07:45

 题意:给你一个n×n的01矩形,初始值全为0,并要你进行几个操作:1.对子矩阵(x1,y1,x2,y2)进行反选; 2.询问(x,y)的值;

二维树状数组的思路并不难想到,但是这题和一般的二维树状数组有点不一样,这题是修改区间,询问点。于是我们便可以用getsum修改,用update查询;

代码如下:

{$inline on}vara:array[1..1024,1..1024]of boolean;m,n,i,j:longint;function lowbit(x:longint):longint;inline;beginexit(x and(-x));end;procedure getsum(x,y:longint);inline;vari,j:longint;begini:=x;while i>0 do  begin    j:=y;    while j>0 do      begin        a[i,j]:=not a[i,j];        j:=j-lowbit(j);      end;    i:=i-lowbit(i);  end;end;function update(x,y:longint):longint;inline;vari,j:longint;ans:boolean;begini:=x;ans:=false;while i<=n do  begin    j:=y;    while j<=n do      begin        ans:=ans xor a[i,j];        j:=j+lowbit(j);      end;    i:=i+lowbit(i);  end;if ans then  exit(1)else  exit(0);end;procedure main;inline;varx1,x2,y2,y1,i,j,k:longint;ch:char;beginfillchar(a,sizeof(a),false);readln(n,m);for i:=1 to m do  begin   read(ch);   if ch='C' then     begin       readln(x1,y1,x2,y2);       getsum(x1-1,y1-1);       getsum(x1-1,y2);       getsum(x2,y1-1);       getsum(x2,y2);     end   else     begin       readln(x1,y1);       writeln(update(x1,y1));     end;  end;end;beginreadln(j);for i:=1 to j do  begin    main;    writeln;{一定要打,否则会PE。好坑啊!}  end;end.若仍看不懂,可以看一下http://blog.sina.com.cn/s/blog_6a16f43f0100m7fw.html个人感觉他写得还不错。

原创粉丝点击