poj 2155

题目:http://poj.org/problem?id=2155



要改变区间内的所有状态,可以套用树状数组里的区间求和,c[i][j]表示  从(1,1)到(i,j)这个矩阵改变的次数。

查找的时候就 查找比 (x1,y1)这个区间大的所有异或结果。



#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long LL;
#define EPS 10e-9
#define INF 0x3f3f3f3f
#define REP(i,n) for(int i=0; i<(n); i++)
const int maxn =1024;
int c[maxn][maxn],n;
int lowbit(int x){ return x&-x;}
void update(int x,int y){
    while(x>0){
        int y1=y;
        while(y1>0){
            c[x][y1]^=1;
            y1-=lowbit(y1);
        }
        x-=lowbit(x);
    }
}
int get(int x,int y){
    int ans=0;
    while(x<=n){
        int y1=y;
        while(y1<=n){
          ans^=c[x][y1];
          y1+=lowbit(y1);
        }
        x+=lowbit(x);
    }
    return ans;
}
int main(){
    int T,t=0,q;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&q);
        memset(c,0,sizeof(c));
        char ch[10];
        int x1,y1,x2,y2;
        while(q--){
            scanf("%s%d%d",&ch,&x1,&y1);
            if(ch[0]=='C'){
                scanf("%d%d",&x2,&y2);
                update(x2,y2);
                update(x1-1,y2);
                update(x2,y1-1);
                update(x1-1,y1-1);
            }
            else printf("%d\n",get(x1,y1));
        }
        if(T)puts("");
    }
    return 0;
}



你可能感兴趣的:(algorithm)