这个题目就是给你一个0-1矩阵,每次给你一个长方形的矩形,在矩形内的所有数据都做非运算。
看出来是一个二维的树状数组,就是求每个点经过了几次翻转,而c数组就是记录翻转的个数的!相当于加 1;
Q时就做%2或者是&2运算;
很基础的模板题。
代码:
#include<cstdio>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int size = 1002;
int C[size][size];
int lowbit(int x)
{
return x&(-x);
}
void Modify(int x, int y)
{
for(int i = x; i <= 1001; i += lowbit(i))
for(int j = y; j <= 1001; j += lowbit(j))
{
C[i][j] ++;
}
}
int Sum(int i, int j)
{
int result = 0;
for(int x = i; x > 0; x -= lowbit(x))
{
for(int y = j; y > 0; y -= lowbit(y))
{
result += C[x][y];
}
}
return result;
}
int main()
{
int cas,q,ca;
char str;
int ans;
int n,m;
int x1,y1;
int j,k,s,t;
scanf("%d",&cas);
while(cas--)
{
cin>>n>>m;
n++;
memset(C,0,sizeof(C));
while (m--)
{
cin>>str;
if(str == 'C')
{
scanf("%d%d%d%d",&j,&k,&s,&t);
Modify(j,k);
Modify(j,t+1);
Modify(s+1,k);
Modify(s+1,t+1);
}
else if (str == 'Q')
{
cin>>x1>>y1;
cout<<Sum(x1,y1)%2<<endl;
}
}
cout<<endl;
}
return 0;
}