poj 2155(树状数组)

来源:互联网 发布:wps办公表格软件 编辑:程序博客网 时间:2024/05/21 23:04

点击打开链接


题意:

给你一个n*n的矩阵(由0或1组成),有两种操作,C x1,y1,x2,y2将两个点组成的矩阵取反。Q x,y,求x,y这一点的值。。。


对于求一点的值,只需要求跟这一点有关的之后的位置翻转多少次就可以。。。

#include"stdio.h"#include"string.h"#define N 1005int C[N][N];int n;int bit(int x){return x&(-x);}int sum(int x,int y){int ans=0;for(int i=x;i>0;i-=bit(i)){for(int j=y;j>0;j-=bit(j))ans+=C[i][j];}return ans;}void update(int x,int y,int a){for(int i=x;i<=n;i+=bit(i)){for(int j=y;j<=n;j+=bit(j))C[i][j]=C[i][j]+a;}}int main(){int T;int m;int i;char s;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);memset(C,0,sizeof(C));for(i=0;i<m;i++){getchar();scanf("%c",&s);if(s=='C'){int x1,x2,y1,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);x2++;y2++;update(x2,y2,1);update(x1,y1,1);update(x2,y1,-1);update(x1,y2,-1);}else{int x,y;scanf("%d%d",&x,&y);printf("%d\n",1&sum(x,y));}}printf("\n");}return 0;}



原创粉丝点击