POJ 2155 Matrix(二维树状数组)

来源:互联网 发布:asp考试系统源码 编辑:程序博客网 时间:2024/05/17 00:11

题目链接:

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

题目大意:

给一个n*n的矩阵,有k个询问。询问分更新和询问操作。

更新操作是对某个小的矩阵进行变换,里面的数(0变1,1变0)。

询问操作是单点询问,问当前这个数是0 还是1。

范围:

n<=1000,k<=5000.

思路:

二维树状数组。

二维的树状数组其实就是在一维树状数组的基础上面加了一维。

c[i][j]就代表了从a[1][1]到从c[i][j]的总和,方式和一维树状数组是一样的。

那么这道题目就是区间更新,单点查询。

区间更新时,我们可以通过update(x1,y1),update(x2+1,y2+1),update(x1,y2+1),update(x2+1,y1)。然后查询的时候就可以看这个点累加了几次,如果是偶数次就是0,否则就是1。

代码:

#include<stdio.h>#include<string.h>int c[1005][1005],n;int lowbit(int x){return x&(-x);}void update(int x,int y,int z){     int  i, j;for( i=x;i<=n;i+=lowbit(i))for( j=y;j<=n;j+=lowbit(j)){c[i][j]+=z;}}int query(int x,int y){int ans=0,i,j;for(i=x;i>0;i-=lowbit(i))for(j=y;j>0;j-=lowbit(j)){ans+=c[i][j];}return ans;}int main(){  char s[3];  int T,X,i,j,k,x1,x2,y1,y2;  scanf("%d",&T);  while(T--)  {  memset(c,0,sizeof(c));  scanf("%d%d",&n,&X);  while(X--)  {  scanf("%s%d%d",s,&x1,&y1);  if(s[0]=='C'){  scanf("%d%d",&x2,&y2);  update(x1,y1,1);  update(x2+1,y2+1,1);  update(x1,y2+1,1);  update(x2+1,y1,1);  }  else {  int xx=query(x1,y1);  if(xx%2)printf("1\n");  else printf("0\n");  }  }  printf("\n");  }}



0 0