Matrix

poj2155:http://poj.org/problem?id=2155

题意:给你一个n*n的矩阵,初始的时候里面的元素都是0,然后又两种操作,一种是C x1 y1 x2 y2把(x1,y1)--(x2,y2)这个矩阵里面的元素取反。Q(x1,y1),查询元素(x1,y1)的值。

题解:二维树状数组的入门题。这里要向下更新,向上统计。更新的时候是^操作,统计的时候也是^操作。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define  MAXN  1002
 6 using namespace std;
 7 int c[MAXN][MAXN];
 8 int n,m,t,cas;
 9 int lowbit(int x){
10    return x&(-x);
11 }
12 void add(int x,int y){
13     for(int i=x;i>=1;i-=lowbit(i)){
14         for(int j=y;j>=1;j-=lowbit(j))
15             c[i][j]=c[i][j]^1;
16     }
17 }
18 int getsum(int x,int y){
19     int ans=0;
20    for(int i=x;i<=n;i+=lowbit(i)){
21         for(int j=y;j<=m;j+=lowbit(j))
22             ans=ans^c[i][j];
23     }
24    return ans;
25 }
26 char temp[10];
27 int x1,y1,x2,y2;
28 int main(){
29     scanf("%d",&cas);
30     int tt=1;
31     while(cas--){
32       memset(c,0,sizeof(c));
33       scanf("%d%d",&n,&t);
34       m=n;
35       if(tt>1)printf("
");
36       tt=2;
37       for(int i=1;i<=t;i++){
38         scanf("%s%d%d",temp,&x1,&y1);
39         if(temp[0]=='C'){
40             scanf("%d%d",&x2,&y2);
41             add(x2,y2);
42             add(x2,y1-1);
43             add(x1-1,y2);
44             add(x1-1,y1-1);
45         }
46         else{
47             printf("%d
",getsum(x1,y1));
48         }
49       }
50     }
51 }
View Code
原文地址:https://www.cnblogs.com/chujian123/p/3861050.html