poj 2155 Matrix(二维树状数组) hdu 3584 Cube(三维)

来源:互联网 发布:rs485网络总线 编辑:程序博客网 时间:2024/06/08 15:25

这类题目国家队论文有讲过,09年的武森<浅谈信息学竞赛中的"0"与”1“>.

要知道状态只有两种,记录下改变的次数sum,再判断下sum%2便可得出(x,y)的状态。更新,不断去覆盖。如二维的这张图:


1,2,3,4,7是更新时未受影响,在第5个区域时,受(x1,y1)影响,所以会改变。在第6个区域时,受(x2+1,y1)和(x1,y1)的影响增加2,因为结果mod 2 所以未有影响。

在第8个区域时受(x1,y2+1)和(x1,y1)影响增加2,同样没有影响,在第九个区域受(x1,y1),(x1,y2+1)(x2+1,y1),(x2+1,y2+1)四个影响增加4,mod 2 仍然没影响。

在更新操作就是不断覆盖时只有第5块区域有改变..~~~

知道了这点就可以迅速水过这种题。

2155 code:

int n,m;int C[maxn][maxn];void update(int x,int y){    for(int i=x;i<=n;i+=lowbit(i))    for(int j=y;j<=n;j+=lowbit(j))    C[i][j]++;}int query(int x,int y){    int ret=0;    for(int i=x;i>0;i-=lowbit(i))    for(int j=y;j>0;j-=lowbit(j))    ret+=C[i][j];    return ret;}int main(){    int t,x1,y1,x2,y2;    char op[5];    cin>>t;    while(t--){        cin>>n>>m;        clr(C,0);        while(m--){            scanf("%s%d%d",op,&x1,&y1);            if(op[0]=='C'){                cin>>x2>>y2;                update(x1,y1);                update(x1,y2+1);                update(x2+1,y1);                update(x2+1,y2+1);            }            if(op[0]=='Q'){                int sum=query(x1,y1);                puts(sum%2?"1":"0");            }        }        puts("");//55.a PE get.    }return 0;}


3584 [code]:


int n,m;int C[maxn][maxn][maxn];void update(int x,int y,int z){    for(int i=x;i<=n;i+=lowbit(i))    for(int j=y;j<=n;j+=lowbit(j))    for(int k=z;k<=n;k+=lowbit(k))    C[i][j][k]++;}int query(int x,int y,int z){    int ret=0;    for(int i=x;i>0;i-=lowbit(i))    for(int j=y;j>0;j-=lowbit(j))    for(int k=z;k>0;k-=lowbit(k))    ret+=C[i][j][k];    return ret;}int main(){    while(~scanf("%d%d",&n,&m)){        clr(C,0);        int op,x1,y1,z1,x2,y2,z2;        while(m--){            scanf("%d%d%d%d",&op,&x1,&y1,&z1);            if(op==1){                scanf("%d%d%d",&x2,&y2,&z2);                update(x1,y1,z1);                update(x1,y1,z2+1);                update(x1,y2+1,z1);                update(x2+1,y1,z1);                update(x2+1,y2+1,z1);                update(x2+1,y1,z2+1);                update(x1,y2+1,z2+1);                update(x2+1,y2+1,z2+1);                //BUG;            }            if(op==0){             //   BUG;                int sum=query(x1,y1,z1);                puts(sum%2?"1":"0");            }        }    }return 0;}





原创粉丝点击