标签:style blog http color os io
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("\n"); 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\n",getsum(x1,y1)); 48 } 49 } 50 } 51 }
标签:style blog http color os io
原文地址:http://www.cnblogs.com/chujian123/p/3861050.html