思路:二维的树状数组,但是没什么好说的,树状数组的水题一道,二维跟一维其实没什么区别,二维就是由很多个一维组成,就是一维的代码再加个for循环就好了,几乎一样~~树状数组的第二种用法,区间更新,单点查询。注意PE~~~最后有个空格~~~这题不用考虑什么更新一次把元素取反,只要把每次更新当做记录一次操作,最后对某个元素的总操作次数取余即可~wa了两次。。一次忘了取余,一次取余写错地方。。。还有就是upDate(x,y)求得的是以(1,1)为左上角,(x,y)为右下角的矩形区域,所以需要减去多余的区域~
AC代码:
import java.util.Scanner;
public class Main
{
static Scanner scan=new Scanner(System.in);
private static int lowbit(int x) {return x&(-x);}
private static void upDate(int[][] c,int x,int y,int add)
{
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
c[i][j]+=add;
}
private static int sum(int[][] c,int n,int x,int y)
{
int sum=0;
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
sum+=c[i][j];
return sum;
}
public static void main(String[] args)
{
int t=scan.nextInt();
while(t-->0)
{
int n=scan.nextInt();
int m=scan.nextInt();
int c[][]=new int[n+1][n+1];
while(m-->0)
{
String s=scan.next();
if(s.charAt(0)=='C')
{
int x1=scan.nextInt();
int y1=scan.nextInt();
int x2=scan.nextInt();
int y2=scan.nextInt();
upDate(c,x2,y2,1);
upDate(c,x1-1,y1-1,1);
upDate(c,x2,y1-1,-1);
upDate(c,x1-1,y2,-1);
}
if(s.charAt(0)=='Q')
{
int x=scan.nextInt();
int y=scan.nextInt();
System.out.println(sum(c,n,x,y)&1);
}
}
System.out.println();
}
}
}