POJ2155_Matrix
这道题我用的是二维树状数组来做得,做法比较简单,都是二维树状数组的基本操作。
C: 给一个子矩阵进行非操作,这个可以用操作次数的叠加来进行,初始操作次数为0,然后每进行一次操作就加1,用的是树状数组更新函数,主要是对四个区域,即调用add(x1,y1),add(x1,y2+1),add(x2+1,y1),add(x2+1,y2+1),画图可知,右边区域,下边区域,右下区域,分别被加了2,2,4次,非操作相当于抵消。
Q: 单点查询,开始我以为是区间查询弄了好久。。。
代码君
#include <iostream>
#include <cstdio>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <string>
#include <cstring>
#include <set>
#include <bitset>
#include <fstream>
#include <functional>
#include <iomanip>
#include <cstdlib>
#define REP(x,y) for(int x=0;x<y;x++)
#define CLR(a,x) memset(a,x,sizeof(a))
#define RP(x,y) for(int x=y;x>=0;x--)
#define FOR(i,x,y) for(int i=x;i<=y;i++)
#define ll long long
#define INF 0X3FFFF
using namespace std;
int a[1005][1005];
int N;
void add(int x,int y){
if(x>N||y>N)return;
for(int i=x;i<=N;i+=i&-i){
for(int j=y;j<=N;j+=j&-j){
a[i][j]+=1;
}
}
}
int query(int x,int y){
int ans=0;
for(int i=x;i>0;i-=i&-i){
for(int j=y;j>0;j-=j&-j){
ans+=a[i][j];
}
}
return ans;
}
int main(){
int n;
cin>>n;
while(n--){
int Q,x1,x2,y1,y2;
cin>>N>>Q;
CLR(a,0);
char s[4];
REP(i,Q){
scanf("%s",s);
if(s[0]=='C'){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
add(x1,y1);
add(x1,y2+1);
add(x2+1,y1);
add(x2+1,y2+1);
}else{
scanf("%d%d",&x1,&y1);
int ans=query(x1,y1);
cout<<ans%2<<endl;
}
}
if(n)cout<<endl;
}
return 0;
}